はじめに
本記事では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
が提供するデフォルトのリトライアルゴリズム・設定ではパフォーマンス上の問題があるケースなど、リトライのアルゴリズムや設定を差し替えたい場合に本記事が参考になれば幸いです。