Upgrade to Pro — share decks privately, control downloads, hide ads and more …

クラウド時代だからSpring-Retryフレームワーク

 クラウド時代だからSpring-Retryフレームワーク

Yu Watanabe

July 23, 2019
Tweet

More Decks by Yu Watanabe

Other Decks in Technology

Transcript

  1. アンケート • Java 5, 6, 7 • Java 8 •

    Java 9,10,11,12… • まさかのJava1.3, 1.4 • わからない 5
  2. コネクションプールライブラリ • apache commons-pool 1.x • apache commons-pool 2.x •

    Tomcat DBCP • HikariCP • その他 (c3po…. • わからない 7
  3. jdbc:mysql://db.biz.internal/hogedb $ host db.biz.internal db.biz.internal is an alias for a.rds.amazonaws.com.

    a.rds.amazonaws.com has address 10.1.1.1 $ host db.biz.internal db.biz.internal is an alias for b.rds.amazonaws.com. b.rds.amazonaws.com has address 10.2.2.2 フェイルオーバー前 フェイルオーバー後 18
  4. フェイルオーバーメカニズムでは、スタンバイ DB インスタンスをポイントするように DB インスタンスの DNS レコードが自動的に変更されます。したがって、DB インスタンスへ の既存の接続の再確立が必要になります。Java DNS

    キャッシュメカニズムがどのよう に機能するかによって、JVM 環境の再設定が必要になる場合があります。フェイルオー バーの際に DNS 値をキャッシュする Java アプリケーションの管理方法の詳細につい ては、「AWS SDK for Java」を参照してください。 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html RDSのマニュアルなのになぜか 「Javaの場合は注意しろ」とわざわざ書いてある(笑) 19
  5. @Bean public DataSource dataSource() { ds = new BasicDataSource(); ds.setUrl()...setUser()...

    setPassword()... ds.maxActive(10? 50? アプリによりけり) ds.setValidationQuery(“SELECT 1”) return new TransactionAwareDatasourceProxy(ds) } // えっ?これだけ? 23
  6. @Bean public DataSource dataSource() { conf = new HikariConfig(); conf.setUrl()...setUser()...

    conf.setMaxIdle(10? 50? アプリによりけり) conf.setConnectionInitSql(...) conf.setConnectionTimeout(数秒) conf.setValidationTimeout(数秒) 意外と少ない設 定で良さげ 29
  7. @Configuration @EnableRetry public HogeConfig {... Javaコンフィグ ...} @Retryable(value = {FooException.class},

    maxAttempts=3) public Bar barMethod(args...) { // なんか不安定かもしれない外部通信 } 32
  8. spring-jdbc提供のDataSourceを拡張 public class FooDataSource extends DelegatingDataSource { @Override public Connection

    getConnection() throws SQLException { return retryTemplate.execute(context -> { if (context.getRetryCount() > 0) { /* warnログなど */ } return super.getConnection(); }); 36
  9. @Bean public java.sql.DataSource dataSource() { conf = new HikariConfig(); conf.set…(jdbc-url,

    user, その他もろもろ) hikariDs = new HikariDataSource(conf); fooDs = new 前ページのFooDataSource(hikariDs); ds = new TransactionAwareDatasourceProxy(fooDs); return ds; 37