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

Bonfire API #1 APIのリトライ処理

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