使用回调和 Eventarc 触发器等待事件


您的工作流可能需要等待外部流程。您可以使用 要等待的 HTTP 回调 另一个服务向回调端点发出请求;请求会恢复 工作流的执行。您还可以 等待使用轮询

本教程演示了如何等待事件,而不是使用轮询 或 Pub/Sub 消息,并使用 HTTP 回调和 Eventarc 触发器。虽然您可以 使用事件或 Pub/Sub 消息触发工作流, 则您可能需要暂停该执行,等待另一个事件 继续。例如,事件触发工作流来启动流程,但 那么工作流需要等待另一个事件, 。您可以通过让一个工作流回调另一个工作流来实现这一点 工作流。

目标

在本教程中,会发生以下情况:

  1. 部署并执行需要等待事件的主要工作流。 由于它必须等待事件发生,因此会将回调详情存储在 Firestore 数据库,以便辅助工作流可以检索 。然后,主要工作流会等待 HTTP 调用。

  2. 辅助工作流由这些事件触发,并检索 从 Firestore 数据库提取回调详细信息 。然后,辅助工作流将回调主工作流 继续执行

下面简要介绍了整个过程:

使用回调以及主要和次要工作流等待事件

主要工作流程:

  1. callback-event-sample 工作流会为两个事件创建回调端点 来源:Pub/Sub 主题和 Cloud Storage 存储桶。
  2. 此工作流将两个回调端点存储在 Firestore 中 文档。
  3. 此工作流会停止执行,并等待 HTTP 请求到达 回调端点

Events:

  1. 事件发生:有消息被发布到 Pub/Sub 主题 并将文件上传到 Cloud Storage 存储桶。

辅助工作流:

  1. Eventarc 会将事件路由到 callback-event-listener 工作流,并触发其执行。
  2. 此工作流会从 Firestore 文档。
  3. 此工作流会执行对 示例工作流。

主要工作流程:

  1. callback-event-sample 工作流会在 回调端点并恢复其执行。
  2. 此工作流会从 Firestore 中删除回调网址 并完成其执行过程。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

您可以在 Google Cloud 控制台中运行以下命令,也可以使用 在您的终端或 Cloud Shell 中运行 Google Cloud CLI。

您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用

控制台

  1. 在 Google Cloud 控制台的“项目选择器”页面上,选择或创建 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

  3. 启用 App Engine、Eventarc、Firestore Pub/Sub API 和 Workflows API。

    启用 API

  4. 为您的工作流创建用于身份验证的服务账号 其他 Google Cloud 服务并为其授予适当的角色:

    1. 在 Google Cloud 控制台中,转到服务账号页面。

      转到“服务账号”

    2. 如需转到创建服务账号页面,请选择您的项目。

    3. 服务账号名称字段中,输入一个名称。Google Cloud 控制台会根据此名称填充服务账号 ID 字段。

      服务账号说明字段中,输入说明。例如 Service account for tutorial

    4. 点击创建并继续

    5. 选择角色列表中,过滤要授予的以下角色 添加到您在上一步创建的用户代管式服务账号:

      • Cloud Datastore User:访问 Datastore 模式 Firestore (Datastore) 数据。
      • Eventarc 事件接收器:用于从事件提供程序接收事件。
      • Logs Writer:用于写入日志。
      • Workflows Invoker:执行工作流并管理 执行。

      如需添加其他角色,请点击 添加其他角色,然后添加其他各个角色。

    6. 点击继续

    7. 如需完成账号的创建过程,请点击完成

  5. 创建一个 Eventarc 触发器,从该触发器路由事件: Cloud Storage,授予 Pub/Sub Publisher 角色 Cloud Storage 服务代理。 通常,此服务代理为 service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com。您可以检索 Cloud Storage 服务代理的电子邮件地址

    1. 在 Google Cloud 控制台中,转到 IAM 页面。

      进入 IAM

    2. 在 Cloud Storage 服务代理对应的行中,点击 修改主账号。(如果未列出服务代理,请继续执行下一步。)此时会打开修改访问权限窗格。

      1. 点击 添加其他角色,然后搜索 Pub/Sub Publisher 角色。
      2. 选择角色。
      3. 点击保存
    3. 如果未列出服务代理,请点击 授予访问权限。此时会打开授予访问权限窗格。

      1. 新的主账号字段中,输入服务代理的电子邮件地址。
      2. 选择角色列表中,搜索 Pub/Sub Publisher 角色。
      3. 选择角色。
      4. 点击保存

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 确保您的 Google Cloud 项目已启用结算功能。 了解如何检查项目是否已启用结算功能

  3. 启用 App Engine、Eventarc Firestore、Pub/Sub 和 Workflows API。

    gcloud services enable \
        appengine.googleapis.com \
        eventarc.googleapis.com \
        firestore.googleapis.com \
        pubsub.googleapis.com \
        workflows.googleapis.com
    
  4. 为您的工作流创建用于身份验证的服务账号 并为其授予适当的角色

    1. 创建服务账号:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      SERVICE_ACCOUNT_NAME 替换为以下项的名称: 服务账号

    2. 将角色授予您在 上一步。针对以下各项运行一次命令 IAM 角色:

      • roles/datastore.user:用于访问 Datastore 模式 Firestore (Datastore) 数据。
      • roles/eventarc.eventReceiver:用于接收来自事件的事件 提供商。
      • roles/logging.logWriter:表示写入日志。
      • roles/workflows.invoker:用于执行工作流并管理 执行。
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE
      

      替换以下内容:

      • PROJECT_ID项目 ID 您在其中创建了服务账号
      • ROLE:要授予的角色
  5. 创建一个 Eventarc 触发器,从该触发器路由事件: Cloud Storage,授予 Pub/Sub Publisher 角色 添加到 Cloud Storage 服务代理。 通常 service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com。 使用 gcloud storage service-agent 先检索 Cloud Storage 服务代理。

    SERVICE_ACCOUNT_STORAGE="$(gcloud storage service-agent --project=PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$SERVICE_ACCOUNT_STORAGE \
        --role=roles/pubsub.publisher
    

创建 Firestore 数据库

Firestore 将您的数据存储在包含字段的文档中 映射至值。这些文档存储在集合中 用于存储您的文档的容器,可用于整理数据和构建 查询。 详细了解 Firestore

请注意,每个 Google Cloud 项目只能有一个 Firestore 数据库。如果您需要创建新数据库,请完成以下步骤。

控制台

  1. 在 Google Cloud 控制台中,前往 Firestore 开始使用页面。

    前往“使用入门”

  2. 点击选择原生模式

    有关选择数据库模式和每项功能的指导 比较,请参阅 选择原生模式或 Datastore 模式

  3. 选择位置列表中,选择 nam5(美国)

    该位置同时适用于 Firestore 数据库和 Google Cloud 项目中的 App Engine 应用。 创建数据库后,您便无法更改此位置。

  4. 点击创建数据库

gcloud

如需创建 Firestore 数据库,您必须先创建一个 App Engine 应用,然后运行 gcloud firestore databases create 命令:

gcloud app create --region=us-central
gcloud firestore databases create --region=us-central

您可以忽略 us-central is not a valid Firestore location 警告。 App Engine 和 Firestore 支持相同的位置 但 App Engine us-central(爱荷华)区域映射到 Firestore nam5(美国) 多区域位置

创建 Pub/Sub 主题

本教程使用 Pub/Sub 作为事件来源。创建 Pub/Sub 主题,以便您可以向该主题发布消息。 详细了解如何创建和管理主题

控制台

  1. 在 Google Cloud 控制台中,前往 Pub/Sub 主题页面。

    打开“主题”

  2. 点击 创建主题

  3. 主题 ID 字段中,输入 topic-callback

  4. 接受其他默认设置。

  5. 点击创建主题

gcloud

要创建主题,请运行 gcloud pubsub topics create 命令:

gcloud pubsub topics create topic-callback

创建 Cloud Storage 存储桶

本教程使用 Cloud Storage 作为事件来源。创建 Cloud Storage 存储桶,以便您可以向其中上传文件。 详细了解如何创建存储分区

控制台

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    转到 Cloud Storage

  2. 点击 创建

  3. 对于存储桶的名称,请输入 PROJECT_ID-bucket-callback

    项目 IDcallback-event-sample 工作流中用于标识存储桶。

  4. 点击继续

  5. 对于位置类型,请选择区域,然后选择 us-central1(爱荷华)

  6. 接受其他默认设置。

  7. 点击创建

gcloud

如需创建存储桶,请运行 gcloud storage buckets create 命令:

gcloud storage buckets create gs://PROJECT_ID-bucket-callback \
    --location=us-central1

项目 IDcallback-event-sample 工作流中用于标识存储桶。

创建事件来源后,您就可以部署事件接收器工作流了。

部署监听事件的工作流

callback-event-listener 工作流会在消息发布后触发 Pub/Sub 主题,或者将文件上传到 Cloud Storage 时 存储桶。工作流接收事件,检索相应的回调。 从 Firestore 数据库检索详细信息,然后发送 HTTP 回调端点。

控制台

  1. 在 Google Cloud 控制台中,前往 Workflows 页面:

    转到 Workflows

  2. 点击 创建

  3. 输入新工作流的名称:callback-event-listener

  4. 区域列表中,选择 us-central1

  5. 选择您之前创建的服务账号

  6. 点击下一步

  7. 在工作流编辑器中,为工作流输入以下定义:

    main:
      params: [event]
      steps:
        - log_event:
            call: sys.log
            args:
              text: ${event}
              severity: INFO
        - init:
            assign:
              - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
              - event_source_tokens: ${text.split(event.source, "/")}
              - event_source_len: ${len(event_source_tokens)}
              - event_source: ${event_source_tokens[event_source_len - 1]}
              - doc_name: ${database_root + event_source}
        - get_document_for_event_source:
            try:
              call: googleapis.firestore.v1.projects.databases.documents.get
              args:
                name: ${doc_name}
              result: document
            except:
                as: e
                steps:
                    - known_errors:
                        switch:
                        - condition: ${e.code == 404}
                          return: ${"No callbacks for event source " + event_source}
                    - unhandled_exception:
                        raise: ${e}
        - process_callback_urls:
            steps:
              - check_fields_exist:
                  switch:
                  - condition: ${not("fields" in document)}
                    return: ${"No callbacks for event source " + event_source}
                  - condition: true
                    next: processFields
              - processFields:
                  for:
                      value: key
                      in: ${keys(document.fields)}
                      steps:
                          - extract_callback_url:
                              assign:
                                  - callback_url: ${document.fields[key]["stringValue"]}
                          - log_callback_url:
                              call: sys.log
                              args:
                                text: ${"Calling back url " + callback_url}
                                severity: INFO
                          - http_post:
                              call: http.post
                              args:
                                  url: ${callback_url}
                                  auth:
                                      type: OAuth2
                                  body:
                                      event: ${event}
  8. 点击部署

gcloud

  1. 为工作流创建源代码文件:

    touch callback-event-listener.yaml
    
  2. 在文本编辑器中,将以下工作流复制到源代码文件中:

    main:
      params: [event]
      steps:
        - log_event:
            call: sys.log
            args:
              text: ${event}
              severity: INFO
        - init:
            assign:
              - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
              - event_source_tokens: ${text.split(event.source, "/")}
              - event_source_len: ${len(event_source_tokens)}
              - event_source: ${event_source_tokens[event_source_len - 1]}
              - doc_name: ${database_root + event_source}
        - get_document_for_event_source:
            try:
              call: googleapis.firestore.v1.projects.databases.documents.get
              args:
                name: ${doc_name}
              result: document
            except:
                as: e
                steps:
                    - known_errors:
                        switch:
                        - condition: ${e.code == 404}
                          return: ${"No callbacks for event source " + event_source}
                    - unhandled_exception:
                        raise: ${e}
        - process_callback_urls:
            steps:
              - check_fields_exist:
                  switch:
                  - condition: ${not("fields" in document)}
                    return: ${"No callbacks for event source " + event_source}
                  - condition: true
                    next: processFields
              - processFields:
                  for:
                      value: key
                      in: ${keys(document.fields)}
                      steps:
                          - extract_callback_url:
                              assign:
                                  - callback_url: ${document.fields[key]["stringValue"]}
                          - log_callback_url:
                              call: sys.log
                              args:
                                text: ${"Calling back url " + callback_url}
                                severity: INFO
                          - http_post:
                              call: http.post
                              args:
                                  url: ${callback_url}
                                  auth:
                                      type: OAuth2
                                  body:
                                      event: ${event}
  3. 输入以下命令以部署工作流:

    gcloud workflows deploy callback-event-listener \
        --source=callback-event-listener.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    SERVICE_ACCOUNT_NAME 替换为 您先前创建的服务账号

部署等待事件的工作流

callback-event-sample 工作流将其回调详细信息存储在 Firestore 数据库,停止执行,然后等待 发生的特定事件

控制台

  1. 在 Google Cloud 控制台中,前往 Workflows 页面:

    转到 Workflows

  2. 点击 创建

  3. 输入新工作流的名称:callback-event-sample

  4. 区域列表中,选择 us-central1

  5. 选择您之前创建的服务账号

  6. 点击下一步

  7. 在工作流编辑器中,为工作流输入以下定义:

    main:
      steps:
        - init:
            assign:
              - pubsub_topic: topic-callback
              - storage_bucket: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
        - await_pubsub_message:
            call: await_callback_event
            args:
              event_source: ${pubsub_topic}
            result: pubsub_event
        - await_storage_bucket:
            call: await_callback_event
            args:
              event_source: ${storage_bucket}
            result: storage_event
        - return_events:
            return:
                pubsub_event: ${pubsub_event}
                storage_event: ${storage_event}
    
    await_callback_event:
        params: [event_source]
        steps:
            - init:
                assign:
                  - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
                  - doc_name: ${database_root + event_source}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
                  - firestore_key: ${"exec_" + text.split(execution_id, "-")[0]}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
                  body:
                    fields:
                      ${firestore_key}:
                        stringValue: ${callback_details.url}
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting 1hr for an event from source " + event_source}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for an event from source " + event_source}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - delete_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
            - check_null_event:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${callback_request.http_request.body.event}
            - return_event:
                return: ${callback_request.http_request.body.event}
  8. 点击部署

gcloud

  1. 为工作流创建源代码文件:

    touch callback-event-sample.yaml
    
  2. 在文本编辑器中,将以下工作流复制到源代码文件中:

    main:
      steps:
        - init:
            assign:
              - pubsub_topic: topic-callback
              - storage_bucket: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
        - await_pubsub_message:
            call: await_callback_event
            args:
              event_source: ${pubsub_topic}
            result: pubsub_event
        - await_storage_bucket:
            call: await_callback_event
            args:
              event_source: ${storage_bucket}
            result: storage_event
        - return_events:
            return:
                pubsub_event: ${pubsub_event}
                storage_event: ${storage_event}
    
    await_callback_event:
        params: [event_source]
        steps:
            - init:
                assign:
                  - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
                  - doc_name: ${database_root + event_source}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
                  - firestore_key: ${"exec_" + text.split(execution_id, "-")[0]}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
                  body:
                    fields:
                      ${firestore_key}:
                        stringValue: ${callback_details.url}
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting 1hr for an event from source " + event_source}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for an event from source " + event_source}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - delete_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
            - check_null_event:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${callback_request.http_request.body.event}
            - return_event:
                return: ${callback_request.http_request.body.event}
  3. 输入以下命令以部署工作流:

    gcloud workflows deploy callback-event-sample \
        --source=callback-event-sample.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    SERVICE_ACCOUNT_NAME 替换为 您先前创建的服务账号

创建 Eventarc 触发器以路由 Pub/Sub 事件

借助 Eventarc 触发器,您可以通过指定 触发器的过滤条件,包括事件来源和目标工作流。 创建 Eventarc 触发器以执行 callback-event-listener 工作流。 Pub/Sub 主题。 详细了解如何触发工作流

控制台

  1. 在 Google Cloud 控制台中,前往 Eventarc 页面。

    转到 Eventarc

  2. 点击 创建触发器

  3. 输入触发器名称

    例如 trigger-pubsub-events-listener

  4. 事件提供方列表中,选择 Cloud Pub/Sub

  5. 事件列表的自定义下,选择 google.cloud.pubsub.topic.v1.messagePublish

  6. 选择 Cloud Pub/Sub 主题列表中,选择您要复制的主题 凭据。

  7. 区域列表中,选择 us-central1(爱荷华)

  8. 如果系统提示,请向以下角色授予 iam.serviceAccountTokenCreator 角色: Pub/Sub 服务账号。

  9. 选择您之前创建的服务账号

  10. 事件目标位置列表中,选择工作流

  11. 选择工作流列表中,选择 callback-event-listener 工作流。

  12. 点击创建

gcloud

如需创建触发器,请运行 gcloud eventarc triggers create 命令:

gcloud eventarc triggers create trigger-pubsub-events-listener \
    --location=us-central1 \
    --destination-workflow=callback-event-listener \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=topic-callback \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

转换事件,并将其作为运行时参数传递给工作流执行作业。 请注意,新触发器最多可能需要 2 分钟才能生效。

创建 Eventarc 触发器以路由 Cloud Storage 事件

借助 Eventarc 触发器,您可以通过指定 触发器的过滤条件,包括事件来源和目标工作流。 创建 Eventarc 触发器以执行 callback-event-listener工作流程。 Cloud Storage 存储桶。 详细了解如何触发工作流

控制台

  1. 在 Google Cloud 控制台中,前往 Eventarc 页面。

    转到 Eventarc

  2. 点击 创建触发器

  3. 输入触发器名称

    例如 trigger-storage-events-listener

  4. 事件提供方列表中,选择 Cloud Storage

  5. 事件列表中的直接下,选择 google.cloud.storage.object.v1.finalized

  6. 存储桶列表中,浏览您之前创建的存储桶。 并将其选中

  7. 区域列表中,根据您的 Cloud Storage 存储桶执行以下操作: 接受默认值 us-central1(爱荷华)

  8. 如果系统提示,请向以下角色授予 iam.serviceAccountTokenCreator 角色: Pub/Sub 服务账号。

  9. 选择您之前创建的服务账号

  10. 事件目标位置列表中,选择工作流

  11. 选择工作流列表中,选择 callback-event-listener 工作流。

  12. 点击创建

gcloud

如需创建触发器,请运行 gcloud eventarc triggers create 命令:

gcloud eventarc triggers create trigger-storage-events-listener \
    --location=us-central1 \
    --destination-workflow=callback-event-listener \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=PROJECT_ID-bucket-callback" \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

转换事件,并将其作为运行时参数传递给工作流执行作业。 请注意,新触发器最多可能需要 2 分钟才能生效。

执行主要工作流

执行工作流会运行与 工作流。执行 callback-event-sample 工作流。这是主要的 该工作流会等待特定事件发生,仅恢复执行 当辅助工作流发出适当的回调请求时。

控制台

  1. 在 Google Cloud 控制台中,前往工作流页面。

    转到 Workflows

  2. 工作流程页面上,点击 callback-event-sample 工作流来转到其详情页面。

  3. 工作流详细信息页面上,选择 执行

  4. 再次点击执行

    工作流执行开始。在执行过程中,您应该会看到 执行状态Running,并日志条目类似于 关注对象:Started waiting 1hr for an event from source topic-callback

gcloud

要执行工作流,请运行 gcloud workflows run 命令:

gcloud workflows run callback-event-sample \
    --location=us-central1

工作流执行开始。在执行过程中,您应该会看到 类似于以下内容的执行状态:

Waiting for execution [a848a164-268a-449c-b2fe-396f32f2ed66] to complete...working...

生成事件并检查执行状态

您可以通过生成事件、查看 日志条目,以及检查工作流执行状态。

发布消息

将消息发布到您之前创建的 Pub/Sub 主题 创建。

控制台

  1. 在 Google Cloud 控制台中,前往 Pub/Sub 主题页面。

    打开“主题”

  2. 点击 topic-callback

  3. 点击消息标签页。

  4. 点击发布消息

  5. 邮件正文字段中,输入 Hello World

  6. 点击发布

gcloud

要发布消息,请使用 gcloud pubsub topics publish 命令:

gcloud pubsub topics publish topic-callback \
    --message="Hello World"

上传对象

将文件上传到您之前创建的 Cloud Storage 存储桶。

控制台

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 点击您之前创建的存储桶的名称。

  3. 对象标签页中,执行以下任一操作:

    • 从桌面或文件管理器拖放所需文件 Google Cloud 控制台的主窗格中。

    • 点击上传文件,选择要上传的文件,然后 然后点击打开

gcloud

如需上传文件,请运行 gcloud storage cp 命令:

gcloud storage cp OBJECT_LOCATION gs://PROJECT_ID-bucket-callback/

OBJECT_LOCATION 替换为您的 对象。例如 random.txt

查看日志条目和执行状态

确认 callback-event-sample 工作流已成功完成。

控制台

  1. 在 Google Cloud 控制台中,前往工作流页面。

    转到 Workflows

  2. 工作流程页面上,点击 callback-event-sample 工作流来转到其详情页面。

  3. 工作流详细信息页面上,检索 请点击相应的执行 ID。

    执行状态应为成功,并且在“输出”窗格中显示 您应该会看到收到的 Pub/Sub Cloud Storage 事件。

gcloud

  1. 过滤日志条目并以 JSON 格式返回输出:

    gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \
        --format=json
    
  2. 查找类似于以下内容的日志条目:

    "textPayload": "Stopped waiting for an event from source..."
    "textPayload": "Calling back url https://workflowexecutions.googleapis.com/v1/projects/..."
    "textPayload": "Started waiting 1hr for an event from source..."
    
  3. 检查上次执行尝试的状态:

    gcloud workflows executions wait-last
    

    结果应类似于以下内容:

    Using cached execution name: projects/1085953646031/locations/us-central1/workflows/callback-event-sample/executions/79929e4e-82c1-4da1-b068-f828034c01b7
    Waiting for execution [79929e4e-82c1-4da1-b068-f828034c01b7] to complete...done.
    [...]
    state: SUCCEEDED
    

清理

如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

要删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除在本教程中创建的资源

  1. 从 Firestore 中删除数据

  2. 删除 Pub/Sub 主题

  3. 删除 Cloud Storage 存储桶

  4. 删除 Eventarc 触发器

  5. 删除工作流

后续步骤