Python を使って再試行ポリシーを実装する

クラウドで実行されるアプリケーション、またはリモート サービスやリソースと通信するアプリケーションは、一時的な障害を処理できる必要があります。 これらのアプリケーションでは、ネットワーク接続の一時的な喪失、サービスまたはリソースがビジーのときの要求のタイムアウト、またはその他の要因により、障害が発生することがよくあります。 開発者は、安定性と回復性を向上させるため、一時的な障害を透過的に処理するようにアプリケーションを構築する必要があります。

この記事では、Python 用 Azure Storage クライアント ライブラリを使用して、Azure Blob Storage に接続するアプリケーションの再試行ポリシーを設定する方法について説明します。 再試行ポリシーは、失敗した要求をアプリケーションが処理する方法を定義しており、アプリケーションのビジネス要件とエラーの性質に合わせて常に調整する必要があります。

再試行オプションを構成する

Blob Storage の再試行ポリシーはプログラムで構成され、さまざまなサービス要求やシナリオに再試行オプションを適用する方法を制御します。 たとえば、ユーザーの操作に基づいて要求を発行する Web アプリでは、応答性を高め、エラーが発生したときにユーザーに通知するために、再試行回数が少なく、遅延が短いポリシーを実装する場合があります。 または、バックグラウンドでバッチ要求を実行するアプリやコンポーネントでは、要求が正常に完了するための時間があるように、再試行回数を増やし、エクスポネンシャル バックオフ戦略を使用する場合があります。

クライアント要求の再試行ポリシーを構成するには、次の方法から選択できます。

  • 既定値を使う: Python 用 Azure Storage クライアント ライブラリの既定の再試行ポリシーは、既定値を使った ExponentialRetry のインスタンスです。 再試行ポリシーを指定しない場合は、既定の再試行ポリシーが使われます。
  • クライアント コンストラクターにキーワードとして値を渡す: サービスのクライアント オブジェクトを作成するときに、再試行ポリシー プロパティの値をキーワード引数として渡すことができます。 この方法では、クライアントの再試行ポリシーをカスタマイズでき、いくつかのオプションを構成するだけでよい場合に便利です。
  • 再試行ポリシー クラスのインスタンスを作成する: ExponentialRetry または LinearRetry クラスのインスタンスを作成し、再試行ポリシーを構成するプロパティを設定できます。 次に、インスタンスをクライアント コンストラクターに渡して、すべてのサービス要求に再試行ポリシーを適用できます。

次の表は、再試行ポリシーの構成に使用できるすべてのプロパティを示しています。 これらのプロパティはいずれもキーワードとしてクライアント コンストラクターに渡すことができますが、一部のプロパティは ExponentialRetry または LinearRetry インスタンスでのみ使用できます。 これらの制限は、変更を加えない場合の各プロパティの既定値と共に表に記載されています。 アプリのニーズに合わせて、これらのプロパティの値を事前に調整しておく必要があります。

プロパティ タイプ 説明 規定値 ExponentialRetry LinearRetry
retry_total int 最大再試行回数。 3 はい はい
retry_connect int 接続の再試行の最大回数 3 はい はい
retry_read int 読み取りの再試行の最大回数 3 はい はい
retry_status int 状態の再試行の最大回数 3 はい はい
retry_to_secondary [bool] 要求をセカンダリ エンドポイントに再試行するかどうか (可能な場合)。 このオプションは、RA-GRS や RA-GZRS など、geo 冗長レプリケーションが有効なストレージ アカウントにのみ使います。 また、アプリが古くなった可能性のあるデータを処理できることを確認する必要もあります。 False はい はい
initial_backoff int 最初の再試行の初期バックオフ間隔 (秒単位)。 エクスポネンシャル バックオフ戦略にのみ適用されます。 15 秒 はい いいえ
increment_base int 最初の再試行後に initial_backoff を増分するベース (秒単位)。 エクスポネンシャル バックオフ戦略にのみ適用されます。 3 秒 はい いいえ
backoff int 各再試行の間のバックオフ間隔 (秒単位)。 線形バックオフ戦略にのみ適用されます。 15 秒 いいえ はい
random_jitter_range int バックオフ間隔のジッター/ランダム化の範囲を示す数値 (秒単位)。 たとえば、random_jitter_range を 3 に設定すると、バックオフ間隔 x が x+3 から x-3 の間で変化することを意味します。 3 秒 はい はい

Note

プロパティ retry_connectretry_readretry_status は、さまざまな種類のエラーをカウントするために使われます。 残りの再試行回数は、次の値: retry_totalretry_connectretry_readretry_status の "最小値" として計算されます。 このため、他のプロパティも設定しない限り、retry_total のみを設定しても効果がない可能性があります。 ほとんどの場合、4 つのプロパティすべてを同じ値に設定して、最大再試行回数を強制できます。 ただし、アプリの特定のニーズに基づいてこれらのプロパティを調整する必要があります。

次のセクションでは、さまざまな手法を使って再試行ポリシーを構成する方法を示します。

既定の再試行ポリシーを使う

Python 用 Azure Storage クライアント ライブラリの既定の再試行ポリシーは、既定値を使った ExponentialRetry のインスタンスです。 再試行ポリシーを指定しない場合は、既定の再試行ポリシーが使われます。 サービスのクライアント オブジェクトを作成するときに、任意の構成プロパティをキーワード引数として渡すこともできます。

次のコード例は、BLOB サービスのクライアント オブジェクトを作成するときに、retry_total プロパティの値をキーワード引数として渡す方法を示しています。 この例では、クライアント オブジェクトは、retry_total プロパティとその他の再試行回数プロパティが 5 に設定された既定の再試行ポリシーを使います。

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()

# Create the BlobServiceClient object with retry options
blob_service_client = BlobServiceClient(account_url, credential, retry_total=5,
                                        retry_connect=5, retry_read=5, retry_status=5)

ExponentialRetry ポリシーを作成する

再試行ポリシーを構成するには、ExponentialRetry のインスタンスを作成し、retry_policy キーワード引数を使ってそのインスタンスをクライアント コンストラクターに渡します。 この手法は、さまざまなクライアントに対して複数のプロパティまたは複数のポリシーを構成する必要がある場合に役立ちます。

次のコード例は、ExponentialRetry のインスタンスを使って再試行オプションを構成する方法を示しています。 この例では、initial_backoff を 10 秒、increment_base を 4 秒、retry_total を 3 回の再試行に設定します。

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()

# Specify retry policy parameters
retry = ExponentialRetry(initial_backoff=10, increment_base=4, retry_total=3)

# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential, retry_policy=retry)

LinearRetry ポリシーを作成する

再試行ポリシーを構成するには、LinearRetry のインスタンスを作成し、retry_policy キーワード引数を使ってそのインスタンスをクライアント コンストラクターに渡します。 この手法は、さまざまなクライアントに対して複数のプロパティまたは複数のポリシーを構成する必要がある場合に役立ちます。

次のコード例は、LinearRetry のインスタンスを使って再試行オプションを構成する方法を示しています。 この例では、backoff を 10 秒に、retry_total を 3 回の再試行に、retry_to_secondaryTrue に設定します。

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()

# Specify retry policy parameters
retry = LinearRetry(backoff=10, retry_total=3, retry_to_secondary=True)

# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential, retry_policy=retry)
  • 再試行ポリシーに関するアーキテクチャのガイダンスと一般的なベスト プラクティスについては、「一時的な障害の処理」をご覧ください。
  • 一時的な障害に対する再試行パターンの実装に関するガイダンスについては、「再試行パターン」をご覧ください。