了解 Eventarc 位置

每个事件来源、事件目标和 Eventarc 触发器都有自己的位置。有时候这些位置必须匹配,有时候则可以不同。如需了解详情,请参阅 Eventarc 位置

来源位置

事件来源的位置通常决定了触发器位置。在以下示例中,由于 Cloud Storage 存储桶位于 europe-west1 区域,因此触发器也必须位于 europe-west1

gcloud eventarc triggers create trigger-storage \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=europe-west1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=my-bucket-in-europe-west1-region" \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

目标位置

部署事件目标(例如 Cloud Run 服务时)时,您需要选择一个受支持的区域作为其位置。出于延迟时间和数据存放位置的考虑,通常选择与事件来源相同的区域。但这不是必需的,在前面的示例中,事件来源位于 europe-west1,而 --destination-run-region 标志表明事件目标位于 us-central1

触发器位置

此外,创建的 Eventarc 触发器的类型会影响 通过 ‑‑location 标志指定的触发器的位置:

Cloud Audit Logs

借助 Cloud Audit Logs 触发器,您可以将发出审核日志的任何事件来源连接到事件目标。Cloud Audit Logs 触发器可在单区域位置使用,您也可以创建全球 Eventarc 触发器;但是,双区域和多区域位置不支持触发器。

事件来源的位置决定了触发器位置,通常是单区域位置。例如,如需使用审核日志触发器从 europe-west1 区域中的存储桶捕获 Cloud Storage 事件,请在同一位置创建触发器:

gcloud eventarc triggers create trigger-auditlog \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=europe-west1 \
    --event-filters="type=google.cloud.audit.log.v1.written" \
    --event-filters="serviceName=storage.googleapis.com" \
    --event-filters="methodName=storage.objects.create" \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

使用 Cloud Audit Logs 触发器时,由于没有按存储桶过滤,因此它将匹配 europe-west1 区域中的所有存储桶。(如需按存储桶过滤,您可以改用直接 Cloud Storage 触发器。)

或者,如需匹配双区域或多区域存储桶(如 eu),您可以使用 global 位置创建触发器,该触发器将匹配事件过滤条件匹配的所有区域中的所有存储桶:

gcloud eventarc triggers create trigger-storage \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=global \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=my-bucket-in-europe-west1-region" \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

Cloud Storage

Cloud Storage 触发器会响应 Cloud Storage 存储桶中的事件,包括对象创建、删除、归档和元数据更新。 Cloud Storage 触发器适用于单区域、双区域和多区域位置;您无法创建全球 Eventarc 触发器。

Cloud Storage 存储桶的位置决定了 Eventarc 触发器的位置,两者必须匹配。 在以下示例中,触发器位置与 Cloud Storage 桶(eu 多区域位置)的位置匹配:

gcloud eventarc triggers create trigger-storage \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=eu \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=my-bucket-in-eu-multi-region" \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

如果存储桶区域与触发器区域不匹配,您将看到类似于以下内容的错误:

ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was
invalid: Bucket "my-bucket-in-eu-multi-region" location "eu" does not match
trigger location "europe-west1". Try again by creating the trigger in "eu".

Pub/Sub

Pub/Sub 触发器会将 Pub/Sub 主题连接到事件目标。Pub/Sub 触发器仅在单区域位置可用,您无法创建全球 Eventarc 触发器。

虽然 Pub/Sub 主题是全球性资源并且不绑定到单个区域,但在创建 Pub/Sub 触发器时,您必须使用 --location 标志为其指定区域:

gcloud eventarc triggers create trigger-pubsub \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=us-central1 \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=projects/your-projectid/topics/your-topic

Eventarc 会配置地理围栏,以使 Pub/Sub 事件仅保留在指定位置。您也可以使用 区域 Pub/Sub 服务端点 发布到主题,以使所有数据保留在单个区域中。

多区域部署和消息重复

为 Pub/Sub 主题创建 Eventarc 触发器时,Eventarc 会自动为该特定触发器创建一个唯一的底层 Pub/Sub 订阅。这样,Eventarc 就可以管理订阅的生命周期、权限和数据驻留合规性。

如果您在多个区域中部署指向同一全球 Pub/Sub 主题的相同触发器,则每个触发器都充当单独的订阅者。由于 Pub/Sub 会将消息传递到所有活跃订阅(扇出),因此您在所有区域中的服务都将接收和处理同一消息,从而导致重复。

如需实现多区域部署而不重复消息,您可以将事件提取与区域处理分离。在单个区域中创建一个 Eventarc 触发器,并将该触发器配置为指向全球外部应用负载均衡器。然后,将负载均衡器配置为将流量路由到您的区域后端,例如多个区域中的 Cloud Run 服务。

这种方法可确保消息仅向负载平衡器传送一次,然后负载平衡器会在各个区域中分发事件。虽然触发器仍为区域级以满足地理围栏要求,但目标可提供全球覆盖。

无论您的架构如何,请确保您的事件处理程序是 幂等的,以处理 潜在的重复项,因为 Eventarc 提供至少一次的 事件传送。

后续步骤

  • 如需了解如何跨 Google Cloud 项目路由事件,请参阅 教程