您的工作流可能需要等待外部进程。您可以使用 HTTP 回调来等待其他服务向回调端点发出请求;该请求将继续执行工作流。您还可以等待使用轮询。
本教程演示了如何使用 HTTP 回调和 Eventarc 触发器等待事件或 Pub/Sub 消息,而不是使用轮询。虽然您可以使用事件或 Pub/Sub 消息触发工作流,但您可能希望暂停该执行,等待另一个事件发生后再继续。例如,某个事件触发工作流来启动进程,但工作流需要等待另一个事件来表明进程已完成。您可以通过让一个工作流回调另一个工作流来实现此目的。
目标
在本教程中,您将执行以下操作:
需要等待事件的主工作流已部署并执行。由于它必须等待事件发生,因此会将回调详细信息存储在 Firestore 数据库中,以便辅助工作流可以检索这些详细信息。然后,主工作流会等待 HTTP 调用。
辅助工作流由事件触发,并在生成事件时从 Firestore 数据库检索回调详细信息。然后,辅助工作流会回调主工作流,主工作流会恢复执行。
以下是整个流程的概览:
主要工作流程:
callback-event-sample
工作流会为两个事件源(Pub/Sub 主题和 Cloud Storage 存储桶)创建回调端点。- 此工作流会将两个回调端点都存储在 Firestore 文档中。
- 此工作流会暂停执行,并等待 HTTP 请求到达回调端点。
Events:
- 发生事件:有消息发布到 Pub/Sub 主题,并且有文件上传到 Cloud Storage 存储桶。
次要工作流:
- Eventarc 将事件路由到
callback-event-listener
工作流并触发其执行。 - 此工作流会从 Firestore 文档中检索相应回调端点网址。
- 此工作流会执行回调,以将数据发送到示例工作流中的相应端点。
主要工作流程:
callback-event-sample
工作流会在回调端点接收事件,并恢复执行。- 此工作流会从 Firestore 文档中删除回调网址,并完成执行。
费用
在本文档中,您将使用 Google Cloud的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
您可以在 Google Cloud 控制台中运行以下命令,也可以在终端或 Cloud Shell 中使用 Google Cloud CLI 运行这些命令。
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
控制台
在 Google Cloud 控制台的项目选择器页面上,选择或创建 Google Cloud 项目。
确保您的 Google Cloud 项目已启用结算功能。 了解如何检查项目是否已启用结算功能。
启用 App Engine、Eventarc、Firestore、Pub/Sub 和 Workflows API。
为工作流创建一个服务账号,以用于向其他 Google Cloud 服务进行身份验证,并向该服务账号授予适当的角色:
在 Google Cloud 控制台中,前往服务账号页面。
如需前往创建服务账号页面,请选择您的项目。
在服务账号名称字段中,输入一个名称。 Google Cloud 控制台会根据此名称填充服务账号 ID 字段。
在服务账号说明字段中,输入说明。例如
Service account for tutorial
。点击创建并继续。
在选择角色列表中,过滤出以下角色,以便授予您在上一步中创建的用户代管式服务账号:
- Cloud Datastore User:用于访问 Datastore 模式的 Firestore (Datastore) 数据。
- Eventarc Event Receiver:用于接收来自事件提供方的事件。
- Logs Writer:用于写入日志。
- Workflows Invoker:用于执行工作流和管理执行任务。
如需添加其他角色,请点击
添加其他角色,然后添加其他各个角色。点击继续。
如需完成账号的创建过程,请点击完成。
如需创建可路由 Cloud Storage 事件的 Eventarc 触发器,请向 Cloud Storage 服务代理授予 Pub/Sub Publisher 角色。通常,此服务代理为
service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com
。您可以检索 Cloud Storage 服务代理的电子邮件地址。在 Google Cloud 控制台中,前往 IAM 页面。
在 Cloud Storage 服务代理对应的行中,点击
修改主账号。(如果未列出服务代理,请继续执行下一步。)此时会打开修改访问权限窗格。- 点击 add添加其他角色,然后搜索 Pub/Sub Publisher 角色。
- 选择角色。
- 点击保存。
如果未列出服务代理,请点击
授予访问权限。此时会打开授予访问权限窗格。- 在新的主账号字段中,输入服务代理的电子邮件地址。
- 在选择角色列表中,搜索 Pub/Sub Publisher 角色。
- 选择角色。
- 点击保存。
gcloud
In the Google Cloud console, 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.
确保您的 Google Cloud 项目已启用结算功能。 了解如何检查项目是否已启用结算功能。
启用 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
为工作流创建一个服务账号,以用于向其他 Google Cloud 服务进行身份验证,并向该服务账号授予适当的角色。
创建服务账号:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
将
SERVICE_ACCOUNT_NAME
替换为服务账号的名称。向您在上一步中创建的用户代管式服务账号授予角色。对以下每个 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
:您在其中创建服务账号的项目 IDROLE
:要授予的角色
如需创建可路由 Cloud Storage 事件的 Eventarc 触发器,请向 Cloud Storage 服务代理授予 Pub/Sub Publisher 角色。通常,此服务代理为
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 数据库。如果您需要创建新数据库,请完成以下步骤。
控制台
在 Google Cloud 控制台中,前往 Firestore 开始使用页面。
点击选择原生模式。
如需有关选择数据库模式的指导以及逐个功能的比较情况,请参阅选择原生模式或 Datastore 模式。
在选择位置列表中,选择 nam5(美国)。
该位置同时适用于 Google Cloud 项目中的 Firestore 数据库和 App Engine 应用。 创建数据库后,您无法更改位置。
点击创建数据库。
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 主题,以便您可以向其发布消息。 详细了解如何创建和管理主题。
控制台
在 Google Cloud 控制台中,前往 Pub/Sub 主题页面。
点击
创建主题。在主题 ID 字段中,输入
topic-callback
。接受其他默认设置。
点击创建主题。
gcloud
要创建主题,请运行 gcloud pubsub topics create
命令:
gcloud pubsub topics create topic-callback
创建 Cloud Storage 存储桶
本教程使用 Cloud Storage 作为事件来源。创建一个 Cloud Storage 存储桶,以便您可以向其中上传文件。 详细了解如何创建存储分区。
控制台
在 Google Cloud 控制台中,前往 Cloud Storage 存储分区页面。
点击
创建。在存储桶的名称中,输入
PROJECT_ID-bucket-callback
。项目 ID 用于
callback-event-sample
工作流中,以标识相应存储桶。点击继续。
对于位置类型,请选择区域,然后选择 us-central1(爱荷华)。
接受其他默认设置。
点击创建。
gcloud
如需创建存储桶,请运行 gcloud storage buckets create
命令:
gcloud storage buckets create gs://PROJECT_ID-bucket-callback \ --location=us-central1
项目 ID 用于 callback-event-sample
工作流中,以标识相应存储桶。
创建事件来源后,您可以部署事件接收器工作流。
部署监听事件的工作流
当消息发布到 Pub/Sub 主题或文件上传到 Cloud Storage 存储桶时,系统会触发 callback-event-listener
工作流。工作流接收事件,从 Firestore 数据库中检索相应回调的详细信息,然后向回调端点发送 HTTP 请求。
控制台
在 Google Cloud 控制台中,前往 Workflows 页面:
点击
创建。输入新工作流的名称:
callback-event-listener
。在区域列表中,选择 us-central1。
选择您之前创建的服务账号。
点击下一步。
在工作流编辑器中,输入工作流的定义:
点击部署。
gcloud
为工作流创建源代码文件:
touch callback-event-listener.yaml
在文本编辑器中,将以下工作流复制到您的源代码文件中:
输入以下命令以部署工作流:
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 数据库中,暂停执行,然后等待特定事件发生。
控制台
在 Google Cloud 控制台中,前往 Workflows 页面:
点击
创建。输入新工作流的名称:
callback-event-sample
。在区域列表中,选择 us-central1。
选择您之前创建的服务账号。
点击下一步。
在工作流编辑器中,输入工作流的定义:
点击部署。
gcloud
为工作流创建源代码文件:
touch callback-event-sample.yaml
在文本编辑器中,将以下工作流复制到您的源代码文件中:
输入以下命令以部署工作流:
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 触发器,以便在向 Pub/Sub 主题发布消息后执行 callback-event-listener
工作流。
详细了解如何触发工作流。
控制台
在 Google Cloud 控制台中,前往 Eventarc 页面。
点击
创建触发器。输入触发器名称。
例如
trigger-pubsub-events-listener
。在事件提供方列表中,选择 Cloud Pub/Sub。
在事件列表中,选择自定义下的 google.cloud.pubsub.topic.v1.messagePublished。
在选择 Cloud Pub/Sub 主题列表中,选择您之前创建的主题。
在区域列表中,选择 us-central1(爱荷华)。
如果出现提示,请向 Pub/Sub 服务账号授予
iam.serviceAccountTokenCreator
角色。选择您之前创建的服务账号。
在事件目的地列表中,选择 Workflows。
在选择工作流列表中,选择 callback-event-listener 工作流。
点击创建。
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 触发器,以便在将文件上传到 Cloud Storage 存储桶后执行 callback-event-listener
工作流。
详细了解如何触发工作流。
控制台
在 Google Cloud 控制台中,前往 Eventarc 页面。
点击
创建触发器。输入触发器名称。
例如
trigger-storage-events-listener
。在事件提供方列表中,选择 Cloud Storage。
在事件列表中,选择直接下的 google.cloud.storage.object.v1.finalized。
在存储桶列表中,浏览并选择您之前创建的存储桶。
在区域列表中,根据您的 Cloud Storage 存储桶,接受默认值 us-central1(爱荷华)。
如果出现提示,请向 Pub/Sub 服务账号授予
iam.serviceAccountTokenCreator
角色。选择您之前创建的服务账号。
在事件目的地列表中,选择 Workflows。
在选择工作流列表中,选择 callback-event-listener 工作流。
点击创建。
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
工作流。这是主要工作流,它会等待特定事件发生,只有在次要工作流发出适当的回调请求时才会恢复执行。
控制台
在 Google Cloud 控制台中,前往 Workflows 页面。
在工作流页面上,点击 callback-event-sample 工作流以转到其详情页面。
在工作流详细信息页面上,选择 play_arrow 执行。
再次点击执行。
工作流执行开始。执行运行时,您应该会看到执行状态为
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 主题发布消息。
控制台
在 Google Cloud 控制台中,前往 Pub/Sub 主题页面。
点击 topic-callback。
点击消息标签页。
点击发布消息。
在消息正文字段中,输入
Hello World
。点击发布。
gcloud
要发布消息,请使用 gcloud pubsub topics publish 命令:
gcloud pubsub topics publish topic-callback \ --message="Hello World"
上传对象
将文件上传到您之前创建的 Cloud Storage 存储桶。
控制台
- 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。
点击您之前创建的存储桶的名称。
在对象标签页中,执行以下任一操作:
将所需文件从桌面或文件管理器拖放到 Google Cloud 控制台的主窗格中。
点击上传文件,选择要上传的文件,然后点击打开。
gcloud
如需上传文件,请运行 gcloud storage cp
命令:
gcloud storage cp OBJECT_LOCATION gs://PROJECT_ID-bucket-callback/
将 OBJECT_LOCATION
替换为对象的本地路径。例如 random.txt
。
查看日志条目和执行状态
确认 callback-event-sample
工作流已成功完成。
控制台
在 Google Cloud 控制台中,前往 Workflows 页面。
在工作流页面上,点击 callback-event-sample 工作流以转到其详情页面。
在工作流详细信息页面上,如需检索特定执行的详细信息,请点击相应的执行 ID。
执行状态应为成功,并且在“输出”窗格中,您应看到收到的 Pub/Sub 和 Cloud Storage 事件。
gcloud
过滤日志条目并以 JSON 格式返回输出:
gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \ --format=json
查找类似如下内容的日志条目:
"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..."
检查最后一次执行尝试的状态:
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
清理
如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除在本教程中创建的资源
后续步骤
- 不妨尝试使用回调创建人机协同工作流教程。