Mais conteúdo relacionado
Semelhante a Bonfire API #1 APIのリトライ処理 (20)
Mais de Yahoo!デベロッパーネットワーク (20)
Bonfire API #1 APIのリトライ処理
- 1. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
2018年2月5日
山内晨吾
APIのリトライ処理
- 2. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
自己紹介
2
8pockets (山内晨吾)
ヤフオク!アプリ開発部
業務で触る言語は
Swift、Go、C++、PHP
- 3. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
目次
・ヤフオク!の設計
・耐久性向上について
・デモ
3
- 5. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ヤフオク! の開発
5
大規模なシステムリニューアル真っ最中
今まで使ってきたレガシー環境を脱却して、
新たな言語やPFに移行している。
新たなシステム設計思想やパターンを適用してコン
テナに載せ替えている。
- 6. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ヤフオク! の設計思想
6
Frontend
Service
DataAccess
Database
スマホ、PC、パートナー向けツール
出品、落札、検索、レコメンド
出品PF、ユーザーPF、課金PF
DB、ストレージ
マイクロサービス化にあたって、開発のしやすさや拡張のしやすさ
を考えて
レイヤーを分けてサービスの設計をしている。
- 7. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ヤフオク! の設計思想
7
きまり
・必ず各レイヤーを通してデータを引くこと
・自分と同じレイヤーのAPIは叩いてはいけない
独立した単機能になるように努力する。
・コンポーネントの役割を明確にして
疎結合にすること。
課題点
・レイヤー化することによるレイテンシの増加がおこり
システムが不安定になるのではないか・・?
- 9. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
耐久性向上
クライアントからサーバーにリクエストする際、
サーバーが落ちている場合、
クライアントで最適なリトライ処理を行いたい。
9
Circuit Breaker / Exponential Backoff
を用いて実現。
- 10. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Circuit Breaker
ある処理のエラー頻度が閾値を超えたら、
実際にサーバーへリクエストせずに即座にエ
ラーを返すパターン
10
- 11. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Circuit Breaker
11
規定の回数失敗したら起動
- 12. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Circuit Breaker
なにがいいのか
タイムアウト待ちを省略してエラーを返却できるので
システム全体の負荷が下がる。
発動時にはアラートで通知することが大事。
システムが復帰した時には、リトライ処理を行うことでリクエストが
再開される
12
- 13. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
13
Exponential Backoff (指数関数的後退)
リトライの待機時間を失敗回数が増えるに連れて、
指数関数的に増やすアルゴリズム
さらに衝突の連続を防ぐために遅延をランダム化。(Jitter)
リトライにより後に成功する可能性が高いリクエストを
救える。
Exponential Backoff
- 14. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Exponential Backoff
14
アルゴリズム例
・サーバーへのリクエストが失敗
・0.5秒待って、リクエストを再試行
・1.0秒待って、リクエストを再試行
・2.0秒待って、リクエストを再試行
・4.0秒待って、リクエストを再試行
・設定した最大待機時間まで増加を繰り返す
- 15. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Exponential Backoff
15
なにがいいのか
長期障害発生時にシステムへの不必要な負担を軽減
大規模分散システム内では常に部分障害が発生しているた
め、運用コストを削減するためのパターン
- 17. Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
取り組みの効果
17
APIリクエスト先は1つではなく、別部署や、全社PFだったり
色々。
リクエスト先の異常も自分たちで出来る限りコントロールできる。
事故の早期発見に繋がり、原因も分かりやすくなった。
アラートが減り、不要な通知が減ったため、対応するタスクが
より明確になった。