はじめに
本記事ではAWS SDK for Goを使ってAWSのAPIをコールする場合のリトライアルゴリズムを差し替える方法を紹介します。
AWS SDK for Go のリトライ
AWS SDK for Go のバージョンは v1.37.6 です。
まず AWS SDK for Go を使ってAPIをコールする場合は、デフォルトでリトライするようになっています 1。そのため AWS SDK for Go を使うアプリケーション側でリトライを実装する必要はありません。AWS SDK for Go 上の実装は client.DefaultRetryer がリトライを実施します。リトライ時の待ち時間である time.Duration を計算するアルゴリズムは RetryRules メソッドとして実装されています。
待ち時間を計算するアルゴリズムはExponential Backoff And Jitter 2です。
- リトライの再試行の待ち時間を計算する
RetryRulesメソッド
// RetryRules returns the delay duration before retrying this request again |
デフォルトの設定
デフォルトのリトライの設定は以下のようになっています。
| No | 項目 | 説明 | デフォルト値(単位) |
|---|---|---|---|
| 1 | NumMaxRetries |
最大リトライ回数 | 3 (回) |
| 2 | MinRetryDelay |
リトライ時の最小の待ち時間 | 30 (ミリ秒) |
| 3 | MinThrottleDelay |
リトライスロットリング 3時の最小の待ち時間 | 300 (ミリ秒) |
| 4 | MaxRetryDelay |
リトライ時の最大の待ち時間 | 300 (秒) |
| 5 | MaxThrottleDelay |
リトライスロットリング時の最大の待ち時間 | 300 (秒) |
RetryRules を差し替える
基本的にはSDKが提供するデフォルトのリトライを実施することで問題ないでしょう。差し替えたくなるケースの1つは、リトライ回数を増やしてリトライエラーを発生させたくないケースです。(ただし、リトライ回数を増やすことでリトライエラーを速やかに解消できる場合に限ります。)リトライ回数が増えると待ち時間が大きくなり、デフォルトの設定の場合最大で300秒です。特定のケースではなるべく早くリトライを試行したい場合があるでしょう。このような場合にリトライアルゴリズムを差し替える方法が役に立ちます。
差し替える方法
Config の Retryer フィールドに値をセットすることで差し替えることができます。
type Config struct { |
Retryer は request.Retryer を満たす型です。Retryer の実装上は RequestRetryer 型で interface{} 型へのDefined typeになっていますが、request.Retryer を満たしていない場合は DefaultRetryer が使われます。
client.DefaultRetryer 構造体を埋め込んで RetryRules メソッドを実装する方法がおすすめです。構造体の埋め込みを利用して、委譲したいメソッドだけを実装する手法はGoではよく使われます。リトライするかどうかの判断基準 (ShouldRetry) はデフォルトの実装のままで、リトライの待ち時間の計算アルゴリズムのみを差し替えることができます。以下の実装は jpillora/backoff のシンプルな上限付きExponential Backoff And Jitterを使った実装です。
- retryer.go
package sample |
- main.go
package main |
上記のようにリトライアルゴリズムを差し替えることができます。もちろん client.DefaultRetryer を使って、リトライの設定(client.DefaultRetryer の MaxRetryDelay など)を変えることによってリトライの待ち時間の計算に影響を及ぼすこともできます。AWS SDK for Go が提供するデフォルトのリトライアルゴリズム・設定ではパフォーマンス上の問題があるケースなど、リトライのアルゴリズムや設定を差し替えたい場合に本記事が参考になれば幸いです。