选择 Azure 事件网格

许多应用程序使用发布-订阅模型通知分布式组件某些事件已发生或某个对象已更改。 假设你有一个音乐共享应用程序,其中包含在 Azure 中运行的 Web API。 当某个用户上传新歌曲时,你需要通知全世界对该流派感兴趣的用户的设备上安装的所有移动应用。

在该体系结构中,声音文件的发布者不需要知道对共享音乐感兴趣的任何订阅者。 此外,我们希望有一种一对多的关系,在这种关系中,我们可以有多个订阅者,他们对这个新歌曲的兴趣是飘忽不定的。 Azure 事件网格是此类体系结构的完美解决方案。

什么是 Azure 事件网格?

Azure 事件网格是在 Azure Service Fabric 顶层运行的完全托管式事件路由服务。 事件网格可将事件从 Azure Blob 存储帐户或 Azure 媒体服务等不同源分发给不同处理程序(例如 Azure Functions 或 Webhook)。 创建事件网格的目的是为了更方便地在 Azure 中生成基于事件的应用程序和无服务器应用程序。

事件网格支持将大多数 Azure 服务作为发布者或订阅者,并可以与第三方服务一起使用。 它提供了一个动态可缩放、低成本的消息传送系统,发布者可以借此通知订阅者有关状态更改的信息。 下图显示了 Azure 事件网格从多个源接收消息,并根据订阅将消息分发给事件处理程序。

在 Azure 事件网格中,有多个概念涉及到将源连接到订阅者:

  • 事件: 发生了什么情况。
  • 事件源: 事件发生的地点。
  • 主题: 其中发布者发送事件的终结点。
  • 事件订阅: 用于路由事件,有时用于多个处理程序的终结点或内置机制。 订阅还用于处理程序,以便智能地筛选传入事件。
  • 事件处理程序: 对事件作出反应的应用或服务。

显示位于多个事件源和多个事件处理程序之间的 Azure 事件网格的示意图。 事件源将事件发送到事件网格,事件网格将相关事件转发给订阅者。 事件网格使用主题来决定将哪些事件发送给哪些处理程序。 事件源使用一个或多个主题标记每个事件,事件处理程序订阅它们感兴趣的主题。

什么是事件?

事件是通过事件网格传递的数据消息,描述已发生的情况。 每个事件都是独立的,最大可为 64 KB,其中根据事件网格定义的架构包含多个信息片段:

[
  {
    "topic": string,
    "subject": string,
    "id": string,
    "eventType": string,
    "eventTime": string,
    "data":{
      object-unique-to-each-publisher
    },
    "dataVersion": string,
    "metadataVersion": string
  }
]
字段 说明
topic 事件源的完整资源路径。 事件网格提供此值。
subject 事件主题的发布者定义路径。
id 事件的唯一标识符。
eventType 此事件源的一个注册事件类型。 可以根据此值创建筛选器,例如 CustomerCreatedBlobDeletedHttpRequestReceived,等等。
eventTime 生成事件的时间,基于提供程序的 UTC 时间。
data 与事件类型相关的具体信息。 例如,与在 Azure 存储中创建的有关新文件的事件将包含有关该文件的详细信息,如 lastTimeModified 值。 再如,事件中心事件具有 Capture 文件的 URL。 此字段是可选的。
dataVersion 数据对象的架构版本。 发布者定义架构版本。
metadataVersion 事件元数据的架构版本。 事件网格定义顶级属性的架构。 事件网格提供此值。

提示

事件网格会发送一个事件来指示某种情况已发生或已更改。 但是,已更改的实际对象并不属于事件数据。 通常会传递一个 URL 或标识符来引用已更改的对象。

什么是事件源?

事件源负责将事件发送到事件网格。 每个事件源都与一个或多个事件类型相关。 例如,Azure 存储是 blob 创建事件的事件源。 IoT 中心是设备创建的事件的事件源。 你的应用程序是你定义的自定义事件的事件源。 稍后会更详细地介绍事件源。

Azure 事件中心提供事件发布程序的概念,事件发布程序经常与事件源混淆。 事件中心的发布者是决定将事件发送到事件网格的用户或组织。 例如,Microsoft 会针对多个 Azure 服务发布事件。 可以从自己的应用程序发布事件。 在 Azure 外部托管服务的组织可以通过事件网格发布事件。 事件源是发布者以及为该发布者生成事件的特定服务。 本单元将会交换使用“发布者”和“事件源”来表示向事件中心发送消息的实体。

什么是事件主题?

事件主题将事件分类为组。 主题由公共终结点表示,事件源将事件发送到主题。 设计应用程序时,可以确定要创建多少个主题。 较大的解决方案将为每个相关事件类别创建自定义主题,而较小的解决方案可能会将所有事件发送到单个主题。 例如,假设有一个应用程序发送有关修改用户帐户和处理订单的事件。 任何事件处理程序都不太可能同时需要这两个类别的事件。 请创建两个自定义主题,让事件处理程序订阅其感兴趣的主题。 事件订阅者可以从特定的主题中筛选所需的事件类型。

主题划分为系统主题和自定义主题。

系统主题

系统主题是 Azure 服务提供的内置主题。 在 Azure 订阅中看不到系统主题,因为发布服务器拥有这些主题,但你可以订阅它们。 若要订阅,可以提供想要从中接收事件的资源的相关信息。 只要你有权访问资源,就可以订阅其事件。

自定义主题

自定义主题是应用程序和第三方主题。 在创建或分配了对自定义主题的访问权限后,就会在订阅中看到该自定义主题。

什么是事件订阅?

事件订阅定义事件处理程序想要接收主题中的哪些事件。 订阅还可以按事件类型或主题筛选事件,从而可以确保事件处理程序仅接收相关事件。

什么是事件处理程序?

事件处理程序(有时称为事件“订阅者”)是可以从事件网格接收事件的任何组件(应用程序或资源)。 例如,Azure Functions 可以执行代码以响应添加到 Blob 存储帐户的新歌曲。 订阅者可以决定他们希望处理的事件,并且事件网格将在新事件可用时高效地通知每个感兴趣的订阅者,而无需轮询。

事件源的类型

可以通过以下 Azure 资源类型生成事件:

  • Azure 订阅和资源组: 订阅和资源组生成与 Azure 中的管理操作相关的事件。 例如,当用户创建虚拟机时,此源会生成一个事件。
  • 容器注册表: 在注册表中添加、删除或更改映像时,Azure 容器注册表服务会生成事件。
  • 事件中心: 事件中心可用于处理和存储来自各种数据源的事件 - 通常与日志记录或遥测相关。 捕获文件时,事件中心可在事件网格中生成事件。
  • 服务总线: 收到没有活动侦听器的活动消息时,服务总线可在事件网格中生成事件。
  • 存储帐户: 用户添加 Blob、文件、表条目或队列消息时,存储帐户可以生成事件。 可将 Blob 帐户和常规用途 V2 帐户用作事件源。
  • 媒体服务: 媒体服务托管视频和音频媒体,并为媒体文件提供高级管理功能。 在视频文件上启动或完成编码作业时,媒体服务可以生成事件。
  • Azure IoT 中心: IoT 中心与 IoT 设备进行通信并从中收集遥测数据。 每当此类通信到达时,它就会生成事件。
  • 自定义事件: 可以使用 REST API 或通过 Java、GO、.NET、Node、Python 和 Ruby 上的 Azure SDK 生成自定义事件。 例如,可以在 Azure 应用服务的 Web 应用功能中创建自定义事件。 当辅助角色从存储队列中获取消息时,这可能会发生在辅助角色中。

这种与 Azure 中各种事件源的深度集成确保了事件网格可以分发与几乎任何 Azure 资源相关的事件。

事件处理程序

Azure 中的以下对象类型可以从事件网格接收和处理事件:

  • Azure Functions: Azure 中运行的自定义代码,无需显式配置主机虚拟服务器或容器。 如果要对事件的自定义响应进行编码,请将 Azure 函数用作事件处理程序。
  • WebHook: Webhook 是实现推送体系结构的 Web API。
  • Azure 逻辑应用: Azure 逻辑应用将业务流程作为工作流进行托管。
  • Microsoft Flow: Flow 也托管工作流,但它更便于非技术人员使用。

应该使用事件网格吗?

在需要以下功能时使用事件网格:

  • 简单性: 在事件网格中,可以直接将源连接到订阅者。
  • 高级筛选: 订阅可以严密控制从主题收到的事件。
  • 扇出: 可以针对相同的事件和主题订阅无限数量的终结点。
  • 可靠性: 事件网格可为每个订阅重试事件传递长达 24 小时。
  • 按事件付费: 仅为传输的事件数付费。

事件网格是一个简单但功能多样的事件分发系统。 使用它可向订阅者传递离散事件,订阅者可快速可靠地接收这些事件。 我们还有一个要检查的消息传递模型 - 如果我们想传递大量事件流,该怎么办? 在这种情况下,事件网格并不是一个合适的解决方案,因为它专用于一次传递一个事件。 我们需要使用另一项 Azure 服务:事件中心。