了解 Eventarc 位置

借助 Eventarc,您可以在 Google Cloud 服务之间路由事件,同时管理数据驻留和处理延迟时间。每个事件工作流都涉及三个位置维度:事件来源(事件的起始位置)、管理路由的 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 项目路由事件,请参阅教程。