ホームページ  >  記事  >  バックエンド開発  >  Google Cloud Python ライブラリでの再試行述語のカスタマイズ

Google Cloud Python ライブラリでの再試行述語のカスタマイズ

Barbara Streisand
Barbara Streisandオリジナル
2024-11-19 18:11:02302ブラウズ

Customizing Retry Predicates in Google Cloud Python Libraries

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 が返され、再試行が妨げられます。

Google Cloud ライブラリでのカスタム述語の使用

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。