自訂 Google Cloud Python 庫中的重試謂詞

Barbara Streisand
發布: 2024-11-19 18:11:02
原創
320 人瀏覽過

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板