Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
クラウド時代だからSpring-Retryフレームワーク
Search
Yu Watanabe
July 23, 2019
Technology
320
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
クラウド時代だからSpring-Retryフレームワーク
Yu Watanabe
July 23, 2019
More Decks by Yu Watanabe
See All by Yu Watanabe
JUnitテストをCI環境で並列で実行する方法とその速度, スケーラビリティ
nabedge
6
2.9k
ツール比較しながら語るO/RマッパーとDBマイグレーション
nabedge
0
180
JavaでWebサービスを作り続けるための戦略と戦術
nabedge
0
110
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
nabedge
0
83
Selenium再入門
nabedge
0
73
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
nabedge
0
93
テストゼロからイチに進むための戦略と戦術
nabedge
0
100
jOOQってなんて読むの?から始めるSpringBootとO/Rマッパーの世界
nabedge
0
160
あなたのプロジェクトが気軽にJavaをバージョンアップするために必要なこと
nabedge
0
71
Other Decks in Technology
See All in Technology
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
550
[MIRU26] Open-Vocabulary Intention-Guided Object Detection in Diverse Scenes
keio_smilab
PRO
0
140
新しい SLO が良い感じにハマっている話
z63d
4
2.1k
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
5
980
AIエージェントを前提としたプラットフォーム エンジニアリング:GKEで作るAgent-Ready Golden Path
legalontechnologies
PRO
1
180
ブラウザ研修 2026
recruitengineers
PRO
3
500
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
230
Pavlokで始める電撃駆動開発
sgrsn
0
170
認知負荷をGemini で溶かす — GKE 基盤「Orbit」における AI エージェントの実践
sansantech
PRO
1
250
AI駆動開発は個人技からチーム戦へ:組織でAIを使いこなすための実践設計
moongift
PRO
0
440
PLaMo 3.0 Primeの構造化出力サポート
pfn
PRO
0
190
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
55
12k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Embracing the Ebb and Flow
colly
88
5.1k
Side Projects
sachag
455
43k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
630
Un-Boring Meetings
codingconduct
0
370
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
250
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Transcript
クラウド時代だから Spring-Retry フレームワーク Y.Watanabe 2019-07-12 JSUG勉強会2019その7 ビズリーチにおけるSpringの活用
ストップウォッチ スタート 確認 2
ビズリーチでは エンジニアを募集しています 3
Who? • 渡辺 祐 • (株)ビズリーチ • SREグループ ◦ Site
Reliability Engeneering 4
アンケート • Java 5, 6, 7 • Java 8 •
Java 9,10,11,12… • まさかのJava1.3, 1.4 • わからない 5
RDBMSは? • オンプレミス • AWS-RDS, Google Cloud SQL • その他クラウド
• わからない 6
コネクションプールライブラリ • apache commons-pool 1.x • apache commons-pool 2.x •
Tomcat DBCP • HikariCP • その他 (c3po…. • わからない 7
今日お話したいこと • 数回の自動リトライで 得られる安眠がある • 自動リトライを実装する前に やるべきことがある • Spring-Retryの原始的な使い方 8
ある日の出来事 1. RDSが障害でフェイルオーバー 2. 90秒で自動復旧した 3. しかしアプリのエラーログアラートは10分以上鳴 りっぱなし 9
誰かがイイこと言った DBがフェイルオーバーしたくらいで なんでこんなに騒いでんの? 10
ある日の出来事(2) Slack APIが 「429 Too Many Request」を返却。 20分くらいエラーログアラートラッシュ 11
自動リトライに向いているのは? • 短期間(数分レベル)で復旧している可能 性が高いなら自動リトライ • そもそも通信過多の場合はスロットリング 12
aws-sdk-javaの場合 スロットリングとリトライの両方を内蔵している 13
1. JDBC接続のリトライ ↑今日はコレ 2. REST-APIへのhttpリクエストのリトライ ↑ ググった結果のコピペでイケます 14
RDSのフェイルオーバーとは? 15
RDSのフェイルオーバーとは • 主系に障害が発生すると 自動的に副系に切り替わる • 公式マニュアルでは 「60秒から120秒かかる」 • 経験値では90秒 16
DBが90秒で復帰してるのに アプリが90秒で復帰できないってどゆこと? 17
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
フェイルオーバーメカニズムでは、スタンバイ 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
まずやるべきこと -Dnetworkaddress.cache.ttl=3 デフォルトは”-1” つまりJVMが生きてる間はDNS検索結果を ずっとキャッシュするのがデフォルト 20
(講演後の追記) 実は前の -Dnetworkaddress.cache.ttl=3 は嘘です。これじゃ設定できないっす。 正確にはこんな感じのコードをpublic static void main(args)を持つクラスの最初の方に 埋め込んでいます。 java.security.Security.setProperty("networkaddress.cache.ttl",
"3"); java.security.Security.setProperty("networkaddress.cache.negative.ttl", "3"); 21
他にもまだあるんじゃね? 22
@Bean public DataSource dataSource() { ds = new BasicDataSource(); ds.setUrl()...setUser()...
setPassword()... ds.maxActive(10? 50? アプリによりけり) ds.setValidationQuery(“SELECT 1”) return new TransactionAwareDatasourceProxy(ds) } // えっ?これだけ? 23
commons-pool 1.x の他のパラメータ • minEvictableIdleTimeMills • numTestPerEvictionRun • testWhileIdle •
validationQueryTimeout • 他多数 24
commons-pool 2.x で増えたパラメータ • fastFailValidation • logAbandoned • removeAbandonedOnBorrow •
他多数 25
• Tomcat-DBCPというのも速いらしい • 最近はやはりHikariCPがデファクトらしい 26
commons-pool 1.x は2012年で打ち止め 27
クラウド時代のRDBに向かって 7年前に開発打ち止めの コネクションプール機構を使い続けるとでも? 28
@Bean public DataSource dataSource() { conf = new HikariConfig(); conf.setUrl()...setUser()...
conf.setMaxIdle(10? 50? アプリによりけり) conf.setConnectionInitSql(...) conf.setConnectionTimeout(数秒) conf.setValidationTimeout(数秒) 意外と少ない設 定で良さげ 29
1. ここまでで最低限の準備が完了 2. ここからが本番の 「RDSがフェイルオーバーしたときの エラーログアラートラッシュ緩和のための Spring-Retry」 30
ちょっと休憩 時間を確認 25分くらい? 31
@Configuration @EnableRetry public HogeConfig {... Javaコンフィグ ...} @Retryable(value = {FooException.class},
maxAttempts=3) public Bar barMethod(args...) { // なんか不安定かもしれない外部通信 } 32
• AOPはちょっぴり遅くなる • RetryTemplateを明示的に使うほうが わかりやすくて確実 33
やりたいこと DB(RDS) JDBCドライバ コネプ アプリケーション DBコネクション取得失敗の場合 に、4回までリトライする 1sec後 -> 2sec
-> 4sec -> 8sec 34
retryTemplate = new RetryTemplate(); retryTemplate.setBackOffPolicy(省略); retryTemplate.setRetryPolicy(省略); 例: Excepation.classはリトライ対象だが RuntimeExceptionは対象外にする、等 まずRetryTemplateを準備しておく
35
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
@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
手動でフェイルオーバーさせて試す 38
DBAさん 39
まとめ 40
• クラウドの向こう側の障害が90秒で回復しても、 それに依存する自分のアプリケーションも90秒で 回復するとは限らない。 • フェイルオーバー試験するしかない。 41
AWS-SDKならその配布ライブラリ自体で リトライ機構が組み込み済みだが... aws-java-sdk-s3 aws-java-sdk-sqs aws-java-sdk-rdb ? aws-java-sdk-jdbc ? 存在しません 42
リトライは 最悪、無くてもいい。 リトライがあれば、DBがfail overから復帰するまでの90 秒のエラーログの飽和(からの精神的苦痛)をやわらげ ることができる DBCPの設定が ちゃんとできてれば 43
ほとんどのコードを書いてくれたS君に感謝 (自分はほぼレビューのみ) 44
週明け、皆さんのプロジェクトでやることは? • DBCPライブラリ、何使ってるか確認する? • DBCPの設定、確認する? • fail over試験、する? • (DBまわりに限らず)Spring-Retry
どこかで使えそう? 45
ビズリーチでは エンジニアを募集しています 46