すこぶる.net

技術系備忘録など

Go

GoでExponential Backoffを使ってリトライ処理を試す

投稿日:

概要

サービスを運用していると、データベースがダウンすることがあります。
完全なダウンではなくとも、バージョンアップやメンテナンスの際のブルーグリーンによる切り替え、フェイルオーバによって一時的に数秒程度データベースへの接続が不能になることがあります。

そこで、もしもデーターベースに接続ができなくなった場合でも、間隔をあけてリトライするように Go言語でExponential Backoffというアプローチを使って対応してみようと思います。

検証

まず、リトライを考慮しないGoの簡単なコードを以下に示します。

データベースへ正常に接続できる場合は以下の結果を受け取ることができます。

しかし、データベースを停止して実行してみると当然以下のような結果になります。

そこで、リトライ機能を Exponential Backoff で実装してみます。
Exponential Backoff はリトライ間隔を指数関数的に増加させる方法です。リトライの間隔を徐々に延ばすことで、システムの負荷を減らし効率的にリトライを実施します。

以下に、Exponential Backoff を追加したGoのコードを示します。

接続に問題がない場合に取得できる結果は先程と変わらないので、一時的にデータベースサーバを停止させてすぐに立ち上げた際の処理結果を確認してみます。

上記の結果の通りではありますが、データベースが落ちている状態から稼働して正常に結果が得られるまでリトライ間隔を延ばしながらリトライを実施し、最後に結果を取得できていることが分かります。

まとめ

多くのサービスで実装されている基本的なものではありますが改めてリトライについて触れてみました。
Exponential Backoff でリトライを実装するメリットは大きいです。しかし、リトライ回数をどこまで延ばすか、つまり何秒までリトライを可能とするかはよく考える必要があります。
バックグラウンドで非同期に処理されるものか、ユーザがリアルタイムで待つ必要がある処理かなどで変わってくると思います。負荷が軽く、より効率的なリトライとは何かを考えていく必要がありそうです。

-Go
-,

執筆者: