选择 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 | 此事件源的一个注册事件类型。 可以针对此值创建筛选器,例如 CustomerCreated 、BlobDeleted 、HttpRequestReceived 等。 |
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 服务的完整列表,请参阅 Azure 事件网格中的系统主题。
- Azure订阅和资源组:订阅和资源组生成与 Azure 中的管理操作相关的事件。 例如,当用户创建虚拟机时,此源会生成一个事件。
- 容器注册表:在注册表中添加、删除或更改映像时,Azure 容器注册表服务会生成事件。
- 事件中心:事件中心可用于处理和存储来自各种数据源的事件,通常与日志记录或遥测相关。 捕获文件时,事件中心可在事件网格中生成事件。
- 服务总线:收到没有活动侦听器的活动消息时,服务总线可在事件网格中生成事件。
- 存储帐户:用户添加 Blob、文件、表条目或队列消息时,存储帐户可以生成事件。 可将 Blob 帐户和常规用途 V2 帐户用作事件源。
- 媒体服务:媒体服务托管视频和音频媒体,并为媒体文件提供高级管理功能。 在视频文件上启动或完成编码作业时,媒体服务可以生成事件。
- Azure IoT 中心:IoT 中心与 IoT 设备通信并从其收集遥测数据。 每当此类通信到达时,它就会生成事件。
有关详细信息,请参阅 Azure 事件网格中的系统主题。
自定义主题
可以使用 REST API 或通过 Java、GO、.NET、Node、Python 和 Ruby 上的 Azure SDK 生成自定义事件。 例如,可以在 Azure 应用服务的 Web 应用功能中创建自定义事件。 当辅助角色从存储队列中获取消息时,这可能会发生在辅助角色中。
这种与 Azure 中各种事件源的深度集成确保了事件网格可以分发与几乎任何 Azure 资源相关的事件。
事件处理程序
Azure 中的以下对象类型可以从事件网格接收和处理事件:
- Azure Functions:Azure 中运行的自定义代码,无需显式配置主机虚拟服务器或容器。 如果要对事件的自定义响应进行编码,请将 Azure 函数用作事件处理程序。
- Azure 逻辑应用:使用逻辑应用实现业务流程以处理事件网格事件。 在这种情况下,不显式创建 Webhook。 当你将逻辑应用配置为处理事件网格中的事件时,系统会自动为你创建 Webhook。
- Webhook:Webhook 是实现推送体系结构的 Web API。 也可使用 Azure 自动化 Runbook 处理事件。 Webhook 支持使用自动化 runbook 来处理事件。 为 runbook 创建 Webhook,然后使用 Webhook 处理程序。
- 事件中心:当解决方案从事件网格获取事件的速度超过其处理事件的速度时,请使用事件中心。 事件位于事件中心后,应用程序可以按自己的计划处理事件中心的事件。
- 服务总线:可以使用服务队列或主题作为事件网格中事件的处理程序。
- 存储队列:使用存储队列来接收需要拉取的事件。 如果正在运行的进程需要很长时间才能响应,可能会使用队列存储。 通过向队列存储发送事件,应用程序可以按照自己的计划拉取和处理事件。
- Microsoft Power Automate:Power Automate 也托管工作流,但它更便于非技术人员使用。
有关详细信息,请参阅事件处理程序。
应该使用事件网格吗?
在需要以下功能时使用事件网格:
- 简单:在事件网格中,可以直接将源连接到订阅者。
- 高级筛选:订阅可以严密控制从主题收到的事件。
- 扇出:可以针对相同的事件和主题订阅无限数量的终结点。
- 可靠性:事件网格可为每个订阅重试事件传递长达 24 小时。
- 按事件付费:仅为传输的事件数付费。
事件网格是一个简单但功能多样的事件分发系统。 使用它可向订阅者传递离散事件,订阅者可快速可靠地接收这些事件。 我们还有一个要检查的消息传递模型;如果我们想传递大量事件流,该怎么办? 在这种情况下,事件网格并不是一个合适的解决方案,因为它专用于一次传递一个事件。 我们需要使用另一项 Azure 服务:事件中心。