你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 HTTP 进行拉取传递

本文是在什么是 Azure 事件网格?和事件网格概念文章的基础上编写的,其中提供了在开始使用事件网格的 HTTP 拉取传递之前需要了解的最基本信息。 其中介绍了基本概念、资源模型和支持的消息传递模式。 本文档末尾提供了有用的链接,这些链接指向有关如何使用事件网格的指南文章,以及提供深入概念信息的文章。

注意

本文档提供有关使用 HTTP 协议的事件网格功能的入门信息。 本文适合需要在云中集成应用程序的用户。 如果需要传送 IoT 设备数据,请参阅 Azure 事件网格中的 MQTT 代理功能概述

CloudEvents

事件网格命名空间主题接受符合云原生计算基础 (CNCF) 开放标准 CloudEvents 1.0 规范的事件,该规范使用 JSON 格式HTTP 协议绑定

有关详细信息,请参阅 CloudEvents 概念

CloudEvents 内容模式

CloudEvents 规范定义了 3 种内容模式供你使用:二进制结构化批量

重要

在任何内容模式下均可交换文本(JSON、text/* 等)或二进制编码事件数据。 二进制内容模式并不专用于发送二进制数据。

内容模式并非关于所使用的编码、二进制或文本,而是关于事件数据及其元数据的描述和交换方式。 结构化内容模式使用单个结构,例如一个 JSON 对象,其 HTTP 有效负载中同时存在上下文属性和事件数据。 二进制内容模式会将上下文属性(映射到 HTTP 标头)和事件数据(根据 Content-Type 中的媒体类型值编码的 HTTP 有效负载)分隔。

有关详细信息,请参阅 CloudEvents 内容模式

消息和事件

CloudEvent 通常包含在系统中声称事件发生的事件数据,即系统状态更改。 但是,在使用 CloudEvents 时,可以传达任何类型的数据。 例如,你可能想要使用 CloudEvents 交换格式发送命令消息,以向下游应用程序请求操作。 另一个示例是将消息从事件网格的 MQTT 代理路由到主题。 在这种情况下,将路由包装在 CloudEvents 信封中的 MQTT 消息。

拉取传递

通过拉取传递,应用程序使用类似队列的语义连接到事件网格并读取 CloudEvents。

拉取传递提供下列事件消耗优势:

  • 按自己的速度、规模或应用程序支持的入口速率使用事件。

  • 在自己选择的时间使用事件。 例如,根据业务要求在夜间处理消息。

  • 通过专用链接使用事件,以便数据使用专用 IP 空间。

注意

  • 命名空间提供一种更简单的资源模型,该模型采用单一类型的主题。 目前,事件网格支持通过命名空间主题发布你自己的应用程序事件。 无法通过命名空间主题使用来自 Azure 服务或合作伙伴 SaaS 系统的事件。 另外,无法在命名空间中创建系统主题、域主题或合作伙伴主题。
  • 命名空间主题支持 CloudEvents JSON 格式。

队列事件订阅

接收事件或使用管理事件状态的操作时,应用程序会指定命名空间 HTTP 终结点、主题名称和队列事件订阅的名称。 队列事件订阅将其 deliveryMode 设置为“队列”。 队列事件订阅用于通过拉取传递 API 使用事件。 若要详细了解如何创建这些资源,请参阅如何创建命名空间主题事件订阅

使用事件订阅来定义事件的筛选条件,这样可有效地定义可供通过该事件订阅使用的事件集。 一个或多个订阅方(使用者)应用程序可连接到同一个命名空间终结点,并使用同一个主题和事件订阅。

High-level diagram of a publisher and consumer using an event subscription. Consumer uses pull delivery.

拉取传递操作

使用拉取传递时,应用程序会执行以下操作。

  • 接收操作用于使用对事件网格的单个请求读取一个或多个事件。 默认情况下,代理等待事件可用,最长等待 60 秒。 例如,事件在首次发布时可供传送。 成功的接收请求返回零个或多个事件。 如果事件可用,则请求会返回尽可能多的可用事件,直到达到请求的事件计数。 事件网格还为每个读取的事件返回一个锁定令牌。
  • 锁定令牌是一种句柄,用于标识可用于控制其状态的事件。
  • 一旦使用者应用程序收到事件并对其进行处理,它就会确认该事件。 此操作会指示事件网格删除该事件,这样它就不会重新传递到另一个客户端。 使用者应用程序通过在事件过期之前指定锁定令牌,使用单个请求确认一个或多个令牌。

在其他一些情况下,使用者应用程序可能会释放或拒绝事件。

  • 使用者应用程序会释放收到的事件,以向事件网格发出信号,表明它尚未准备好处理该事件并使其可重新传递。 为此,它会调用发布操作,并使用锁定令牌标识要返回到事件网格的事件。 应用程序可控制是否应立即释放事件,或者是否应在事件可用于重新传送之前使用延迟。

  • 如果存在阻止使用者应用程序处理事件的状况(可能是永久性状况),你可以选择拒绝该事件。 例如,可能会拒绝格式错误的消息,因为无法成功分析它。 如果死信目标可用,则会将拒绝的事件加入死信队列。 否则,它们将被删除。

拉取传递操作运行的范围

调用接收、确认、发布、拒绝或续订锁定操作时,这些操作将在事件订阅的上下文中执行。 例如,如果确认某个事件,则无法再通过调用确认操作时使用的事件订阅使用该事件。 其他事件订阅仍可能有“相同”事件可用。 这是因为事件订阅会获取已发布的事件的副本。 这些事件副本实际上在事件订阅中彼此不同。 每个事件都有自己的状态,与其他事件无关。

使用拉取传递接收事件时的数据形状

使用拉取传递来传递事件时,事件网格包含一组对象,这些对象又包括 eventbrokerProperties 对象。 事件属性的值是在结构化内容模式下传递的 CloudEvent。 brokerProperties 对象包含与传递的 CloudEvent 关联的锁定令牌。 以下 json 对象是一个接收操作的示例响应,该操作返回两个事件:

{
    "value": [
        {
            "brokerProperties": {
                "lockToken": "CiYKJDUwNjE4QTFFLUNDODQtNDZBQy1BN0Y4LUE5QkE3NjEwNzQxMxISChDXYS23Z+5Hq754VqQjxywE",
                "deliveryCount": 2
            },
            "event": {
                "specversion": "1.0",
                "id": "A234-1234-1235",
                "source": "/mycontext",
                "time": "2018-04-05T17:31:00Z",
                "type": "com.example.someeventtype",
                "data": "some data"
            }
        },
        {
            "brokerProperties": {
                "lockToken": "CiYKJDUwNjE4QTFFLUNDODQtNDZBQy1BN0Y4LUE5QkE3NjEwNzQxMxISChDLeaL+nRJLNq3/5NXd/T0b",
                "deliveryCount": 1
            },
            "event": {
                "specversion": "1.0",
                "id": "B688-1234-1235",
                "source": "/mycontext",
                "type": "com.example.someeventtype",
                "time": "2018-04-05T17:31:00Z",
                "data": {
                    "somekey" : "value",
                    "someOtherKey" : 9
                }
            }
        }
    ]
}

推送和拉取传递

事件网格使用 HTTP 来支持推送和拉取事件传递。 使用推送传递时,需要在事件订阅、Webhook 或 Azure 服务中定义一个目标,以便事件网格将事件发送到该目标。 使用拉取传递时,订阅服务器应用程序将连接到事件网格以使用事件。 事件网格命名空间中的主题支持拉取传递。

重要

支持将事件中心作为命名空间主题订阅的目标。 在即将发布的版本中,事件网格命名空间支持事件网格基本版中当前支持的所有目标以及更多目标。

High-level diagram showing push delivery and pull delivery with the kind of resources involved.

何时使用推送传递与拉取传递

以下一般指导原则可帮助你确定何时使用拉取传递或推送传递。

拉取传递

  • 应用程序或服务发布事件。 当事件源是 Azure 服务合作伙伴 (SaaS) 系统时,事件网格目前不支持拉取传递。
  • 完全由你控制何时接收事件。 例如,应用程序可能不会一直运行、不够稳定,或者你要在特定的时间处理数据。
  • 完全由你控制事件的使用。 例如,使用者应用程序中的下游服务或层出现问题,导致无法处理事件。 在这种情况下,拉取传递 API 允许使用者应用将已读取的事件释放回代理,以便可以稍后传递。
  • 你希望在接收事件时使用专用链接,这只能通过拉取传递实现,推送传递则不支持。
  • 你无法公开终结点和使用推送传递,但可以连接到事件网格以使用事件。

推送传递

  • 你需要接收来自应用程序的事件。 推送传递支持这些类型的事件源。
  • 你希望避免通过不断的轮询来确定是否发生了系统状态更改。 你希望在发生状态更改时使用事件网格向你发送事件。
  • 你的某个应用程序无法发出出站调用。 例如,你的组织可能担心数据外泄。 但是,应用程序可以通过公共终结点接收事件。

后续步骤

以下文章提供了有关如何使用事件网格的信息,或有关概念的更多信息。