Eventarc Standard 支援至少傳送一次事件。也就是說,如果目的地無法確認事件,Eventarc 會自動嘗試重新傳送。
Eventarc Standard 的重試特性與其傳輸層 Cloud Pub/Sub 相同,後者會使用訂閱重試政策處理處理失敗情形。
重試的運作方式
建立 Eventarc 觸發條件時,系統會自動為您建立 Pub/Sub 傳輸主題和訂閱項目。(來自 Pub/Sub 來源的事件可以使用現有的 Pub/Sub 主題。)
Eventarc 自動建立的任何訂閱 ID,格式開頭都會是 eventarc-REGION-。
根據預設,如果目的地無法確認訊息,Pub/Sub 會以指數輪詢延遲再次傳送訊息。指數輪詢可讓您在每次重試之間,逐步增加延遲時間。預設延遲時間至少為 10 秒,每次後續失敗都會增加,最多為 600 秒。Eventarc 會將預設訊息保留時間設為 24 小時。
如要進一步瞭解 Pub/Sub 如何處理重試,請參閱「處理訊息傳送失敗」和「重試要求」。
處理重試的最佳做法
如果事件訊息無法在訊息保留期限內成功傳送,系統會捨棄該訊息 (除非已設定 dead-letter 主題)。您可以透過 dead-letter 主題儲存及分析持續性失敗。請參閱本文「無效信件主題」一節。
由於事件至少會傳送一次,事件處理常式可能會收到重複的事件。最佳做法是將處理常式設計為冪等。請參閱本文「等冪事件處理常式」一節。
設定重試
您可能想自訂預設的重試行為。所有重試和保留設定,都是透過與 Eventarc 觸發條件相關聯的 Pub/Sub 訂閱項目重試政策設定。
如要修改訂閱重試政策,請先找出與 Eventarc 觸發條件相關聯的 Pub/Sub 訂閱項目。然後更新訂閱方案。
如要進一步瞭解訂閱項目屬性,請參閱「訂閱項目屬性」。如要瞭解訂閱項目限制,請參閱 Pub/Sub 資源限制。
找出訂閱項目
如要找出與 Eventarc 觸發條件相關聯的 Pub/Sub 訂閱項目,請按照下列步驟操作:
控制台
在 Google Cloud 控制台中,前往 Eventarc 的「Triggers」(觸發條件) 頁面。
在觸發條件清單中,按一下要查看詳細資料的觸發條件。
按一下主題名稱。
如要顯示訂閱 ID,請按一下「訂閱項目」分頁標籤。
gcloud
您可以使用 gcloud eventarc triggers describe 指令擷取訂閱 ID。
gcloud eventarc triggers describe TRIGGER_NAME \ --location=LOCATION
更改下列內容:
TRIGGER_NAME:觸發條件的名稱或完整 ID。LOCATION:Eventarc 觸發條件的位置。
這項指令會傳回類似下列的觸發條件資訊,包括訂閱 ID:
createTime: '2023-03-16T13:40:44.889670204Z'
destination:
cloudRun:
path: /
region: us-central1
service: hello
eventDataContentType: application/protobuf
eventFilters:
...
transport:
pubsub:
subscription: projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID
topic: projects/PROJECT_ID/topics/TOPIC_ID
Terraform
如要說明 google_eventarc_trigger Terraform 資源,可以使用 state show 指令。
terraform state show google_eventarc_trigger.default
state show 指令會傳回觸發條件的相關資訊,包括訂閱 ID。例如:
# google_eventarc_trigger.default:
resource "google_eventarc_trigger" "default" {
conditions = {}
create_time = "2025-07-14T17:29:22.575033822Z"
effective_labels = {
"goog-terraform-provisioned" = "true"
}
...
transport {
pubsub {
subscription = "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID"
topic = "projects/PROJECT_ID/topics/TOPIC_ID"
}
}
}
如要進一步瞭解如何使用 Terraform,請參閱 Terraform on Google Cloud 說明文件。
REST
如要說明特定專案和位置的觸發條件,請使用 projects.locations.triggers.get 方法。
使用任何要求資料之前,請先修改下列項目的值:
TRIGGER_NAME:要說明的觸發條件名稱。PROJECT_ID:您的 Google Cloud專案 ID。LOCATION:建立觸發程序的區域,例如us-central1。
請展開以下其中一個選項,以傳送要求:
如果成功,回應主體會包含 Trigger 的執行個體,類似於下列內容:
{
"name": "projects/PROJECT_ID/locations/LOCATION/triggers/TRIGGER_NAME",
"uid": "d700773a-698b-47b2-a712-2ee10b690062",
"createTime": "2022-12-06T22:44:04.744001514Z",
"updateTime": "2022-12-06T22:44:09.116459550Z",
"eventFilters": [
{
"attribute": "type",
"value": "google.cloud.pubsub.topic.v1.messagePublished"
}
],
"serviceAccount": "SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com",
"destination": {
"workflow": "projects/PROJECT_ID/locations/LOCATION/workflows/WORKFLOW_NAME"
},
"transport": {
"pubsub": {
"topic": "projects/PROJECT_ID/topics/TOPIC_ID",
"subscription": "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID"
}
}
}
更新訂閱方案
如要更新與 Eventarc 觸發條件相關聯的 Pub/Sub 訂閱項目重試政策,請按照下列步驟操作:
控制台
在 Google Cloud 控制台中,前往 Eventarc 的「Triggers」(觸發條件) 頁面。
在觸發條件清單中,按一下要查看詳細資料的觸發條件。
按一下主題名稱。
如要顯示訂閱 ID,請按一下「訂閱項目」分頁標籤。
按一下訂閱 ID,然後按一下 「編輯」。
在「Retry policy」(重試政策) 區段中,選取「Retry immediately」(立即重試)。
或者,如要在指數輪詢延遲時間過後重試,請輸入下列以秒為單位的數值:
輪詢時間下限:連續傳送特定訊息之間的最短延遲時間 (以秒為單位)。預設值為 10 秒,且應介於 0 到 600 之間。
輪詢時間上限:連續傳送特定訊息之間的最長延遲時間 (以秒為單位)。預設值為 600 秒,應介於 0 到 600 之間。
詳情請參閱「重試政策」。
按一下「Update」。
gcloud
您可以使用
gcloud pubsub subscriptions update
指令更新訂閱重試政策。
gcloud pubsub subscriptions update SUBSCRIPTION_ID \ --min-retry-delay=MIN_RETRY_DELAY \ --max-retry-delay=MAX_RETRY_DELAY
更改下列內容:
SUBSCRIPTION_ID:訂閱項目的 ID 或完整 ID。如要在指數輪詢延遲後重試,必須指定下列兩個標記;否則,任何省略的標記都會還原為預設值:
MIN_RETRY_DELAY:連續傳送指定訊息之間的最短延遲時間 (以秒為單位)。預設為 10 秒,且應介於 0 到 600 之間。MAX_RETRY_DELAY:連續傳送特定訊息之間的最大延遲時間 (以秒為單位)。預設值為 600 秒,且應介於 0 到 600 之間。
如有需要,您可以使用 --clear-retry-policy 標記清除重試政策,並將訂閱項目設為立即重試。
Terraform
如要更新 Pub/Sub 訂閱項目的重試政策,請設定 google_pubsub_subscription Terraform 資源。使用 import 區塊匯入現有訂閱項目,讓 Terraform 可以在狀態檔案中追蹤資源。然後,您可以使用 ignore_changes 指定 Terraform 在更新資源時應忽略的屬性,像管理任何其他資源一樣管理匯入的資源。
例如:
import { to = google_pubsub_subscription.default id = "SUBSCRIPTION_ID" } resource "google_pubsub_subscription" "default" { name = "SUBSCRIPTION_ID" topic = "TOPIC_ID" retry_policy { minimum_backoff = "MIN_RETRY_DELAYs" maximum_backoff = "MAX_RETRY_DELAYs" } lifecycle { # Ignore push delivery configuration which is managed by Eventarc ignore_changes = [push_config] } }
更改下列內容:
SUBSCRIPTION_ID:訂閱 ID。TOPIC_ID:主題 ID。MIN_RETRY_DELAY:連續傳送指定訊息之間的最短延遲時間 (以秒為單位)。預設為 10 秒,且應介於 0 到 600 之間。MAX_RETRY_DELAY:連續傳送特定訊息之間的最大延遲時間 (以秒為單位)。預設值為 600 秒,且應介於 0 到 600 之間。
REST
如要更新特定專案中訂閱項目的重試政策,請使用 projects.subscriptions.patch 方法。
使用任何要求資料之前,請先修改下列項目的值:
MIN_RETRY_DELAY:連續傳送指定訊息之間的最短延遲時間 (以秒為單位)。預設值為 10 秒,且應介於 0 到 600 之間。MAX_RETRY_DELAY:連續傳送指定訊息之間的最大延遲時間 (以秒為單位)。預設值為 600 秒,且應介於 0 到 600 之間。PROJECT_ID:您的 Google Cloud專案 ID。SUBSCRIPTION_ID:要更新的 Pub/Sub 訂閱項目 ID。
JSON 要求內文:
{
"subscription": {
"retryPolicy": {
"minimumBackoff": "MIN_RETRY_DELAYs",
"maximumBackoff": "MAX_RETRY_DELAYs"
}
},
"updateMask": "retry_policy.maximum_backoff,retry_policy.minimum_backoff"
}
請展開以下其中一個選項,以傳送要求:
如果成功,回應主體會包含 Subscription 的執行個體,類似於下列內容:
{
"name": "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID",
"topic": "projects/PROJECT_ID/topics/TOPIC_ID",
...
"retryPolicy": {
"minimumBackoff": "MIN_RETRY_DELAYs",
"maximumBackoff": "MAX_RETRY_DELAYs"
},
"state": "ACTIVE"
}
其他重試注意事項
處理處理失敗或轉送未送達的訊息時,請注意下列事項。
延遲推送
如果推送訂閱者傳送過多負面確認訊息,Pub/Sub 可能會開始使用推送退避傳送訊息。Pub/Sub 採用推送退避策略時,會停止傳送訊息一段預先決定的時間。時間範圍可介於 100 毫秒到 60 秒之間。時間到期後,Pub/Sub 會再次開始傳送訊息。詳情請參閱「推送退避」。
dead-letter 主題
如果目的地未收到訊息,您可以將未送達的訊息轉送至無效信件主題 (也稱為無效信件佇列)。如果目的地無法確認訊息,dead-letter 主題就會儲存這些訊息。建立或更新 Pub/Sub 訂閱項目時,您必須設定死信主題,而不是在建立 Pub/Sub 主題時,或 Eventarc 建立 Pub/Sub 主題時。詳情請參閱「設定 dead-letter 主題」。
不值得重試的錯誤
如果應用程式使用 Pub/Sub 做為事件來源,但事件未傳送成功,系統會自動重試,但若發生錯誤,則無法保證會重試。如果工作流程未執行,系統不會重試從任何來源傳送至 Workflows 目的地的事件。請注意,工作流程執行作業開始後,Workflows 就會確認收到事件。如果工作流程執行作業開始後失敗,系統不會重試執行作業。如要解決這類服務問題,您應在工作流程中處理錯誤和重試。
重複的活動
系統可能會將重複事件傳送至事件處理常式。根據 CloudEvents 規格,source 和 id 屬性的組合視為不重複,因此任何具有相同組合的事件都會視為重複事件。一般而言,建議您導入等冪事件處理常式。
冪等事件處理常式
可重試的事件處理常式應為冪等函式,並遵循下列一般準則:
- 許多外部 API 都可讓您提供冪等鍵做為參數。如果您使用此類 API,應使用事件 ID 做為冪等鍵。
- 冪等可以與至少一次的執行完美搭配使用,因為冪等可以使重試安全執行。因此,編寫可信賴程式碼的一般最佳做法是將冪等與重試結合使用。
- 請確保您的程式碼為內部冪等,例如:
- 確保異動可以發生多次,也不會變更結果。
- 在變更狀態之前,查詢交易中的資料庫狀態。
- 確保所有連帶影響本身也是冪等的。
- 在服務外強制執行交易檢查,不受程式碼影響。 例如,將已處理的特定事件 ID 保持於在某處記錄的狀態。
- 請在頻外處理重複的呼叫。比方說,發生重複呼叫後,使用單獨的清理程序清理所用資源。