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.7k
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.9k
進化する配信ロジックとDSP戦略
yyhayashi303
1
170
モブプロ導入で見えてきた効果@オレシカナイト
yyhayashi303
1
1.1k
CTRオンライン予測システムのアーキテクチャ
yyhayashi303
2
4.3k
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
54
13k
How STYLIGHT went responsive
nonsquared
100
5.6k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Unsuck your backbone
ammeep
671
58k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
790
Writing Fast Ruby
sferik
628
61k
Facilitating Awesome Meetings
lara
54
6.4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
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を入れることで障害の連鎖を防ぐことが出来る • 障害発生時のハンドリングはそもそもちゃんとやっておく • 監視や運用のツールとしても使えるので有用