Backoffアルゴリズムとは何かcloudpackエバンジェリストの吉田真吾(@yoshidashingo)です。指数関数的に処理のリトライ間隔を後退させるアルゴリズムのことです。詳しくはWikipediaに記載があります。Wikipedia日本語でブログに書かれている方もいらっしゃいます。Blogこれを見ていると、どうやらこのアルゴリズムは古くから通信装置において、イーサネットフレームのデータ送信時にコリジョン(衝突)を検出したら一定時間待機して再送して、処理を完結させるためのアルゴリズムとして使われているようです。通信機器の世界に限らず、アプリケーションの分野でも、大規模で予測不能な処理量を有限なリソースでさばく場合に、一時的にリソースを超過したリクエストが来ても特定のスロットリング機構なしでリクエストが最終的にさばけるという点で優れていると思います。backoffでリトライさせる、などの組み合わせで実装をするといいと思います。ちまたにいろんな実装方法が示されているようです。backoffについての記載がされています。大規模分散システム内では常に部分障害(特に一時的)が発生している障害発生時にいちいちシステムを止めていては高可用性を実現できないリトライにより後に成功する可能性が高い部分的で一時的な障害のためにサービスを止めたり、サービスに介入するオペレーションをせず、リソースの再配置などサービス側のオペレーションが完了したら、ユーザー側からのリクエストがほどなく再送されてきて処理が完結するという、サービスの可用性を考慮した流れですね。Retriesという章には、AWS上のアプリケーションのリトライ実装として以下のように推奨されています。ServicesAWSにおけるエラーのリトライとエクスポネンシャルバックオフについてDNSサーバーやスイッチ、ロードバランサーやその他のさまざまなネットワークコンポーネントはリクエストを処理するいずれかにおいてエラーを生成することがありえます。ネットワーク化された環境においてこれらのエラーに対処するためのよくあるテクニックは、クライアントアプリケーション側にリトライ処理を実装することです。このテクニックによりアプリケーションの信頼性が向上し、運用コストを削減することができます。SDKには自動リトライ処理が実装されています。Javaでは、ClientConfigurationクラスを用いることで、この自動リトライの設定を行うことが可能になっています。最小限のレイテンシとリトライなしで作成したいWebページがあるという場合には、リトライロジックをオフにすることもできます。その場合はClientConfigurationクラスを使用して、maxErrorRetry値を0にすることでリトライをオフにできます。SDKを使用していない場合は、サーバーエラー(5xx)やスロットリングエラーを受け取ったら同一のリクエストを再送するようにしてください。クライアントエラー(4xx)の場合はリトライする前にリクエスト内容自体を修正する必要があります。Backoffアルゴリズムを使用することをおすすめします。Backoffの考え方は、連続したエラーに対して、次第にリトライ間隔を長くするというものです。最大遅延間隔に加えて、最大リトライ回数も実装するとよいでしょう。最大遅延間隔も最大リトライ回数も固定値で設定する必要はなく、オペレーションの内容やネットワークのレイテンシなどの個別の要素を考慮したうえで設定されるべきです。Backoffアルゴリズムは、連続したコリジョン(衝突)を避けるため、乱数によってタイミングをずらす実装がされていますが、ここではコリジョンを避ける必要があるわけではないので、乱数の実装は不要です。以下のサンプルコードは遅延を増加させて状態をポーリングする方法を示しています。MAX_RETRIES))次のコードは、Javaでこの遅延を増加させる実装をしている例です。waitTime;}可用性を高め、運用コストを削減するアプローチとして、覚えておきましょう。吉田真吾(@yoshidashingo)です。6/22(月)〜6/28(日)cloudpackエバンジェリストの吉田真吾(@yoshidashingo)です。相談する3/14発売。開催します!HISTORY人気記事Qiitaに投稿した記事yoshidashingoのtips読まれてますスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。