等待使用回调

回调允许工作流执行操作等待其他服务向回调端点发出 请求;该请求将继续执行 工作流。

借助回调,您可以告知工作流指定事件已发生,然后等待该事件而不进行轮询。例如,您可以创建一个工作流,以便在产品再次有货或发货时向您发出通知;或等待以进行人工互动,例如审核订单或验证翻译。

本页面介绍了如何创建工作流来支持回调端点,并等待来自外部进程的 HTTP 请求到达该端点。您还可以 使用回调和 Eventarc 触发器等待事件

回调需要使用两个标准库内置函数:

创建接收回调请求的端点

创建一个可以接收到达相应端点的 HTTP 请求的回调端点。

  1. 按照步骤创建新的工作流,或选择要更新的现有工作流,但暂时不要部署。
  2. 在工作流的定义中,添加一个步骤来创建回调端点:

    YAML

        - create_callback:
            call: events.create_callback_endpoint
            args:
                http_callback_method: "METHOD"
            result: callback_details
        

    JSON

        [
          {
            "create_callback": {
              "call": "events.create_callback_endpoint",
              "args": {
                "http_callback_method": "METHOD"
              },
              "result": "callback_details"
            }
          }
        ]
          

    METHOD 替换为所需的 HTTP 方法,即 GETHEADPOSTPUTDELETEOPTIONSPATCH 之一。默认值为 POST

    结果是映射 callback_details,其中包含一个用于存储已创建端点的网址的 url 字段。

    回调端点现在可以使用 指定的 HTTP 方法接收传入请求。创建的端点的网址可用于从工作流外部的进程触发 回调;例如,将网址传递给 Cloud Run 函数。

  3. 在工作流的定义中,添加一个步骤来等待回调请求:

    YAML

        - await_callback:
            call: events.await_callback
            args:
                callback: ${callback_details}
                timeout: TIMEOUT
            result: callback_request
        

    JSON

        [
          {
            "await_callback": {
              "call": "events.await_callback",
              "args": {
                "callback": "${callback_details}",
                "timeout": TIMEOUT
              },
              "result": "callback_request"
            }
          }
        ]
          

    TIMEOUT 替换为工作流应等待请求的秒数上限。默认值为 43200(12 小时)。如果在收到请求之前超过此时间,则会引发 TimeoutError

    请注意,执行时长有上限。如需了解详情,请参阅 请求限制

    前面 callback_details 映射从前面 create_callback 步骤作为参数传递。

  4. 部署您的工作流以完成创建或更新。

    收到请求后,请求的所有详细信息都会存储在 callback_request 映射中。然后,您可以访问整个 HTTP 请求,包括其标头、正文以及任何查询参数的 query 映射。例如:

    YAML

        http_request:
          body:
          headers: {...}
          method: GET
          query: {}
          url: