rusotoでリトライを実装する

rusotoでAPIレスポンスに応じたリトライを実装する場合dynamiteでの実装が簡潔に参考になります。
2021.10.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

オフィシャルのRust AWS SDKが公開されて久しいですがまだrusotoを使っている人は多いと思いいます。今回rusotoに実装されていないけどよく使う2つの機能を自前で実装してみたのでそれぞれ記事にしたいと思います。

やったこと

  • 各AWSサービスクライアントのAPIをタイムアウト付きで実行する (前回)
  • 各AWSサービスのレスポンスに応じてリトライを実行する ← 今回はこっち

dynomiteでの実装

rusotoをラップしたDynamoDB用のcrate dynomiteリトライが比較的簡潔に実装されているので参考にしました。ここでは実装の概要を紹介します。

  • 実処理の再実行、スリープなどの実装はagain crateを使う
  • 自前で定義するリトライポリシー RetryからagainのRetryPolicyへの変換を定義しておく
  • リトライするかどうかを判定するtrait Retryを定義してAPIのレスポンスの型ごとにインスタンスを定義する
  • インスタンスの定義はretry! マクロで行う https://github.com/softprops/dynomite/blob/master/dynomite/src/retry.rs#L886-L903

DynamoDB on local stackでのリトライのテスト

DynamoDBとkinesis限定になりますが、localstackのオプションを使うことでランダムにスロットリングエラーを発生させることができます。スロットリング起因のリトライをテストするにはこれを使いました。

以下の環境変数にスロットリングが発生する確率を0〜1の範囲で指定します。

まとめ

dynamiteでの実装を参考にしてrusotoでリトライ処理を実装しました。