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_connect
、retry_read
、retry_status
は、さまざまな種類のエラーをカウントするために使われます。 残りの再試行回数は、次の値: retry_total
、retry_connect
、retry_read
、retry_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_secondary
を True
に設定します。
# 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)