Eventarc 中的重复事件触发了 Google Cloud Run 服务

Mik*_*ike 3 google-bigquery google-cloud-platform

我创建了一项 Google Cloud Run 服务,该服务执行 BigQuery ETL 操作以响应写入审核日志的 BigQuery 事件。我的服务是作为 Python Flask 应用编写的,它遵循如何对 BigQuery 事件触发 Cloud Run 操作中给出的原则。更具体地说,当 Google Analytics 数据导入 BigQuery 时,Eventarc 会触发该服务。

\n

我可以通过在 Docker 容器中启动应用程序并向服务发送包含来自适当审核日志条目的 JSON 的 POST 请求来在本地测试此功能。它按预期工作:执行 ETL 操作并且不返回任何错误。

\n

该应用程序部署到 Google Cloud 时没有出现问题。Google Analytics 导入完成后,Eventarc 会正确触发服务。服务按预期运行,正确执行 ETL 操作并返回 200 OK 响应。但随后会使用同一事件重复调用该服务。仅当激活下一个 Eventarc 触发器时,此循环才会停止。

\n
    \n
  • Eventarc 所依据的源事件仅在审核日志中出现一次。
  • \n
  • 我的服务记录事件 JSON,使我能够确认该服务确实重复接收相同的事件。
  • \n
  • “重试”之间的时间各不相同,但可以是从几秒到大约 10 分钟的任何时间。
  • \n
  • 即使删除并重新部署服务和 Eventarc 触发器后,重试仍会继续。
  • \n
  • 如果我使用curl 来发布事件,则不会出现该问题。
  • \n
\n

ETL 操作大约需要 60 秒。如果我用一条语句替换 ETL 操作time.sleep(60),也会出现同样的问题,10 秒时也是如此。但是,如果我删除 ETL 操作并完全休眠,重试循环就会停止。

\n

最后,Metrics Explorer 显示了一系列webhook_timeout针对“Cloud Pub/Sub 订阅 - 推送请求”的响应。

\n

所有这些都表明“系统”正在重试该事件,因为它花费的时间太长。但为什么?我该如何解决它?

\n
$ gcloud run services describe XXX-svc\n\xe2\x9c\x94 Service XXX-svc in region XXX\n\nURL:     https://XXX\nIngress: internal\nTraffic:\n  100% LATEST (currently XXX)\n\nLast updated on 2022-08-04T08:27:05.918172Z by XXX:\n  Revision XXX\n  Image:           XXX\n  Port:            8080\n  Memory:          512Mi\n  CPU:             1000m\n  Service account: XXX\n  Concurrency:     80\n  Min Instances:   1\n  Max Instances:   1\n  Timeout:         300s\n\n$ gcloud --project="${PROJECT}" eventarc triggers describe XXX-trigger --location=XXX\ncreateTime: \'2022-08-04T06:59:33.232085395Z\'\ndestination:\n  cloudRun:\n    region: XXX\n    service: XXX-svc\neventFilters:\n- attribute: resourceName\n  operator: match-path-pattern\n  value: projects/XXX/jobs/*\n- attribute: type\n  value: google.cloud.audit.log.v1.written\n- attribute: serviceName\n  value: bigquery.googleapis.com\n- attribute: methodName\n  value: google.cloud.bigquery.v2.JobService.InsertJob\nname: projects/XXX/locations/XXX/triggers/XXX-trigger\nserviceAccount: XXX\ntransport:\n  pubsub:\n    subscription: projects/XXX/subscriptions/eventarc-XXX-XXX-trigger-sub-724\n    topic: projects/XXX/topics/eventarc-XXX-XXX-trigger-724\nuid: XXX\nupdateTime: \'2022-08-04T10:15:33.683873843Z\'\n
Run Code Online (Sandbox Code Playgroud)\n
\n

更新

\n

感谢@guillaume blaquiere接受的答案和@Pentium10的评论,我能够更新Pub/Sub 订阅确认截止日期

\n
# List Eventarc trigger names.\ngcloud \\\n  --project="${PROJECT}" \\\n  eventarc triggers list \\\n  --format=\'value(name)\'\n\nTRIGGER="..."\n\n# Get the Eventarc trigger Pub/Sub subscription name.\nPUBSUB=$(gcloud \\\n  --project="${PROJECT}" \\\n  eventarc triggers describe "${TRIGGER}" \\\n  --format=\'value(transport.pubsub.subscription)\')\n\n# Describe the subscription.\ngcloud \\\n  --format=json \\\n  pubsub subscriptions describe "${PUBSUB}"\n\n# Update the acknowledgement deadline.\ngcloud \\\n  pubsub subscriptions update "${PUBSUB}" \\\n  --ack-deadline=300\n
Run Code Online (Sandbox Code Playgroud)\n

gui*_*ere 5

这是正确的。Eventarc 由 PubSub 支持,默认情况下,PubSub 订阅预计在 10 秒内得到答复。

这是 Eventarc 的默认配置。

因为您的事件处理需要 60 秒,所以它会循环重复该事件......


我遇到了同样的问题,并与 PM 分享。目前,eventarc(API 或 Terraform(我的情况))中没有任何内容可以解决该问题。

因为它支持 PubSub,所以您可以更新 PubSub 订阅并更新确认截止日期。订阅的名称是eventarc-<REGION or GLOBAL>-<EVENTARC NAME>-sub-<Random suffix>