SlideShare a Scribd company logo
クラウド時代だから
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

More Related Content

PDF
JVMのGCアルゴリズムとチューニング
PDF
これからSpringを使う開発者が知っておくべきこと
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
Unified JVM Logging
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
分散トレーシング技術について(Open tracingやjaeger)
PPTX
MongoDBが遅いときの切り分け方法
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
JVMのGCアルゴリズムとチューニング
これからSpringを使う開発者が知っておくべきこと
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
Unified JVM Logging
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
分散トレーシング技術について(Open tracingやjaeger)
MongoDBが遅いときの切り分け方法
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス

What's hot (20)

PDF
イミュータブルデータモデルの極意
PPTX
マイクロサービスにおける 結果整合性との戦い
PDF
マルチテナントのアプリケーション実装〜実践編〜
PPTX
さくっと理解するSpring bootの仕組み
PDF
KubernetesでRedisを使うときの選択肢
PDF
DevOps with Database on AWS
PDF
マルチテナント化で知っておきたいデータベースのこと
PPTX
NGINXをBFF (Backend for Frontend)として利用した話
PPTX
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
PDF
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
PDF
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
PDF
CRDT in 15 minutes
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PDF
Serf / Consul 入門 ~仕事を楽しくしよう~
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト
PDF
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
PDF
SQL大量発行処理をいかにして高速化するか
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
PPTX
世界一わかりやすいClean Architecture
PDF
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
イミュータブルデータモデルの極意
マイクロサービスにおける 結果整合性との戦い
マルチテナントのアプリケーション実装〜実践編〜
さくっと理解するSpring bootの仕組み
KubernetesでRedisを使うときの選択肢
DevOps with Database on AWS
マルチテナント化で知っておきたいデータベースのこと
NGINXをBFF (Backend for Frontend)として利用した話
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
CRDT in 15 minutes
新入社員のための大規模ゲーム開発入門 サーバサイド編
Serf / Consul 入門 ~仕事を楽しくしよう~
[社内勉強会]ELBとALBと数万スパイク負荷テスト
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
SQL大量発行処理をいかにして高速化するか
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
世界一わかりやすいClean Architecture
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Ad

More from Y Watanabe (20)

PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
PDF
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
PDF
Selenium再入門-W3C勧告とページオブジェクトパターンと私-201707webエンジニア勉強会#2神田
PDF
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
PDF
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
PDF
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
PDF
properties, yaml, and me
PDF
テストゼロからイチに進むための戦略と戦術
PDF
The cost of learning - advantage of mixer2
PDF
テンプレートエンジンにMixer2を使うとSeleniumでのテストもラクになるかもねという話
PDF
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
PDF
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
PDF
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
PDF
Seleniumと相性がいいテンプレートエンジンMixer2-第1回selenium勉強会ライトニングトーク
PDF
201311 webデザイナとエンジニアのチームワークを加速させるテンプレートエンジンmixer2 devlove現場甲子園
PDF
Mixer2によるdynamic css sprite 201309第三回渋谷java
PDF
2013-09 テンプレートエンジンMixer2紹介 HTML5J&JJUG合同勉強会LT
PDF
20130511 jjug ccc講演 さらばjsp JAXBとmixer2
PDF
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
Selenium再入門-W3C勧告とページオブジェクトパターンと私-201707webエンジニア勉強会#2神田
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
properties, yaml, and me
テストゼロからイチに進むための戦略と戦術
The cost of learning - advantage of mixer2
テンプレートエンジンにMixer2を使うとSeleniumでのテストもラクになるかもねという話
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
Seleniumと相性がいいテンプレートエンジンMixer2-第1回selenium勉強会ライトニングトーク
201311 webデザイナとエンジニアのチームワークを加速させるテンプレートエンジンmixer2 devlove現場甲子園
Mixer2によるdynamic css sprite 201309第三回渋谷java
2013-09 テンプレートエンジンMixer2紹介 HTML5J&JJUG合同勉強会LT
20130511 jjug ccc講演 さらばjsp JAXBとmixer2
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Ad

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