Google Cloud の Python ライブラリは復元性を考慮して設計されています。一時的なエラーを効果的に処理するための強力な再試行メカニズムが追加されています。ただし、デフォルトの再試行動作が適切ではない状況も考えられます。たとえば、再試行をトリガーすべきではない特定のエラーが発生したり、再試行ロジックをさらに制御する必要がある場合があります。
このブログ投稿では、Google Cloud の Python ライブラリがカスタム再試行述語とどのように連携して、特定の要件に合わせて再試行動作をカスタマイズできるかを説明します。
このブログ投稿では、Google Cloud ライブラリ内でのサービス アカウントの偽装の使用に関連する具体的な例を取り上げたいと思います。私が設計し、現在取り組んでいるアーキテクチャでは、ユーザー環境を個別の Google Cloud プロジェクトに分離しています。一部のサービスでは、特定のユーザー フローでパフォーマンスが低下していることに気付きました。調査した結果、問題の原因は前述のライブラリのデフォルトの再試行動作にまで遡りました。
カスタマイズに入る前に、Google Cloud Python ライブラリのデフォルトの再試行動作を理解することが重要です。これらのライブラリには通常、再試行のためのジッターが追加された指数関数的バックオフ戦略が採用されています。これは、一時的なエラーが発生した場合、ライブラリは少し遅れて操作を再試行し、後続の試行ごとに遅延が指数関数的に増加することを意味します。ジッターが含まれると遅延にランダム性が生じ、複数のクライアント間での再試行の同期が妨げられます。
この戦略は多くの状況で効果的ですが、すべてのシナリオにとって理想的であるとは限りません。たとえば、サービス アカウントの偽装を使用していて認証エラーが発生した場合、操作を再試行しても役に立たない可能性があります。このような場合、再試行が成功する前に、根本的な認証の問題を解決する必要がある可能性があります。
Google Cloud ライブラリでは、カスタム再試行述語を使用して、再試行が行われる正確な条件を指定できます。例外を入力として受け入れ、操作を再試行する必要がある場合は True を返し、再試行しない場合は False を返す関数を作成できます。
たとえば、サービス アカウントの偽装中に発生する特定の認証エラーの再試行を防止するカスタムの再試行述語を次に示します。
from google.api_core.exceptions import GoogleAPICallError from google.api_core.retry import Retry, if_transient_error def custom_retry_predicate(exception: Exception) -> bool: if if_transient_error(exception): # exceptions which should be retried if isinstance(exception, GoogleAPICallError): if "Unable to acquire impersonated credentials" in exception.message: # look for specific impersonation error return False return True return False
この述語は、例外が GoogleAPICallError であるかどうかを確認し、特に「偽装された資格情報を取得できません」というメッセージを探します。この条件が満たされる場合、False が返され、再試行が妨げられます。
Firestore:
from google.api_core.exceptions import GoogleAPICallError from google.api_core.retry import Retry, if_transient_error def custom_retry_predicate(exception: Exception) -> bool: if if_transient_error(exception): # exceptions which should be retried if isinstance(exception, GoogleAPICallError): if "Unable to acquire impersonated credentials" in exception.message: # look for specific impersonation error return False return True return False
BigQuery:
from google.cloud import firestore # ... your Firestore setup ... retry = Retry(predicate=custom_retry_predicate, timeout=10) # example of an arbitrary firestore api call, works with all stream = collection.stream(retry=retry)
どちらの例でも、カスタム述語とタイムアウト値を使用して Retry オブジェクトを作成します。この Retry オブジェクトは、それぞれの API 呼び出しに引数として渡されます。
カスタムの再試行述語は、Google Cloud アプリケーションの復元力を強化する効果的な方法を提供します。特定の要件に合わせて再試行動作をカスタマイズすることで、アプリケーションの堅牢性、効率性、拡張性を確保できます。エラー処理を自分で行い、再試行プロセスをマスターしてください!
以上がGoogle Cloud Python ライブラリでの再試行述語のカスタマイズの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。