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
CircuitBreakerの適用
Search
Yoshitomo Hayashi
February 28, 2017
0
1.6k
CircuitBreakerの適用
Yoshitomo Hayashi
February 28, 2017
Tweet
Share
More Decks by Yoshitomo Hayashi
See All by Yoshitomo Hayashi
Ameba DSPのOpen-Auctionにおける入札戦略
yyhayashi303
2
2.8k
進化する配信ロジックとDSP戦略
yyhayashi303
1
160
モブプロ導入で見えてきた効果@オレシカナイト
yyhayashi303
1
1k
CTRオンライン予測システムのアーキテクチャ
yyhayashi303
2
4.2k
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Navigating Team Friction
lara
183
15k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
A Philosophy of Restraint
colly
203
16k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Gamification - CAS2011
davidbonilla
80
5.1k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
BBQ
matthewcrist
85
9.4k
Visualization
eitanlees
146
15k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
Transcript
CircuitBreakerの適用 サイバーエージェント 林 欣朋
目次 • CircuitBreakerの説明 • 障害発生時のハンドリング • 運用・監視として使うCircuitBreaker • まとめ
CircuitBreakerとは Service-A Down Service-B Service-C マイクロサービスで繋がるシステム Service-Cがダウンした場合、障害が連鎖する Timeout Timeout
CircuitBreakerとは Service-A Down Service-B Service-C CircuitBreakerがService-Cの異常を検知し、経路を遮断することで障害の連鎖を防 ぐ Circuit Breaker
マーティン・ファウラー氏のブログ( https://martinfowler.com/bliki/CircuitBreaker.html) OSSの実装 - Java - https://github.com/Netflix/Hystrix - https://github.com/Comcast/jrugged -
Scala - https://github.com/FaKod/Circuit-Breaker-for-Scala - Ruby - https://github.com/wsargent/circuit_breaker/tree/master CircuitBreakerとは
CircuitBreakerのステータス • CLOSED ◦ リモートサービスへのリクエストを実行出来る • OPEN ◦ OPENの間はリモートサービスへのリクエストを実行出来ない •
HALF_OPEN ◦ リモートサービスへのリクエストを再試行し、成功した場合はステータスをリセットする
ステータスの遷移 HALF_OPEN CLOSED OPEN リクエストが失敗した場合 一定期間後HALF_OPEN へ 再試行が失敗した場合 再試行が成功した場合 初期状態
インターフェース interface CircuitBreaker { // リクエスト可能な場合にtrueを返す Boolean allowRequest(); // 処理が正常終了したことを記録する
void onSuccess(); // 処理が異常終了したことを記録する void onFailure(); }
使用例 if (circuitBreaker.allowRequest()) { try { // invoke remote service
circuitBreaker.onSuccess(); } catch (Exception e) { circuitBreaker.onFailure(); } } else { // CircuitBreaker OPEN }
設定値 // 処理を開始する最小リクエスト数 private Integer requestVolumeThreshold; // OPENとなるエラー率 private Integer
errorThresholdPercentage; // エラー率をチェックするデータの期間 private Integer checkDurationSecond; // OPENからHALF_OPENとなるまでの期間 private Integer openDurationSecond;
ステータスの遷移 HALF_OPEN CLOSED OPEN 直近30秒間のリクエストでエラー率が 50%を超えた場合 30秒間はOPEN その後HALF_OPENに 初期状態 再試行の結果、エラー率が
50%を超えた場合 再試行の結果、エラー率が 50%を下回った場合
CircuitBreaker作動イメージ Service-A Down Service-B Service-C 計測したエラー率からService-Cの異常を検知し、経路を遮断することで障害の連鎖 を防ぐ Circuit Breaker エラー率
> 50%
障害発生時のハンドリング① 例)ターゲティングServiceがダウンした場合 ターゲティングは出来ないので、ターゲティング設定がある広告は候補から除外して 処理を継続する
障害発生時のハンドリング② 例)リタゲの実績やフリークエンシーが取得できない場合 • リタゲ設定のある広告は除外して処理を継続する • フリークエンシーキャップ設定のある広告は除外して処理を継続する
障害発生時のハンドリング③ 例)ランキング用の広告の実績(imp/click)が取得できない場合 • ランダムで配信する • 予測CTRが使える場合は予測CTRでのランキングにする
監視を入れる あるサービスが復数のサービスと連携している時に、経路毎にCircuitBreakerの監 視があると、どこで問題が起きているのかがいち早くわかる。
ステータスを運用ツールから変更できる 運用ツールからCircuitBreakerのステータスを任意で変更できると、あるサービスへ の通信だけを止めたいといった運用が簡単に出来るようになる。
まとめ • CircuitBreakerを入れることで障害の連鎖を防ぐことが出来る • 障害発生時のハンドリングはそもそもちゃんとやっておく • 監視や運用のツールとしても使えるので有用