Azure 事件网格中的事件域为数千个与同一应用程序相关的单个主题提供单个发布终结点。 可以将事件域视为包含多个单个主题的元主题。 发布事件时,发布者必须在要发布到的事件域中指定目标主题。 发布者可以发送一个数组或一批事件,其中事件将发送到事件域中的不同主题。 有关详细信息,请参阅 发布到事件域。
事件域还提供对每个主题的身份验证和授权控制,以便对租户进行分区。 本文介绍如何使用事件域来管理各种业务组织、客户或应用程序的自定义事件流。 事件域可用于:
- 对多租户事件驱动架构进行规模化管理。
- 管理身份验证和授权。
- 对主题进行分区,而不单独管理每个主题。
- 避免单独发布到每个主题终结点。
事件域示例用例
解释事件域最简单的方法是采用示例。 假设你经营着 Contoso 建筑机械公司,你在其中制造拖拉机、挖掘设备和其他重型机械。 运营业务时,可向客户推送有关设备维护、系统运行状况、合同更新的实时信息。 所有这些信息都会发布到各种终结点,包括应用、客户终结点以及客户已安装的其他基础结构。
事件域让你可以将 Contoso Construction Machinery 建模为单个事件网格实体。 您的每个客户在该域中都表示为一个主题。 身份验证和授权是使用 Microsoft Entra ID 处理的。 您的每位客户都可以订阅其主题,并接收发送给他们的事件。 通过事件域管理访问权限可确保客户仅能访问其主题。
此外,你还可获得一个单个终结点,可将所有客户事件发布至此终结点。 事件网格会确保每个主题只能感知限定在其租户范围内的事件。
事件域的访问管理
事件域通过Azure基于角色的访问控制(Azure RBAC)对每个主题提供精细的授权和身份验证控制。 使用 Azure RBAC 角色将应用程序中每个租户的访问范围限制为仅允许其访问你想要授予其访问权限的主题。 事件域中 Azure RBAC 的工作方式与托管访问控制在事件网格和 Azure 的其余部分中的工作方式相同。 使用 Azure RBAC 在事件域中创建和强制实施自定义角色定义。
事件域的内置角色
事件网格具有两个内置角色定义,使 Azure RBAC 更易于使用事件域:
- EventGrid EventSubscription 参与者
- EventGrid EventSubscription 读取器
将这些角色分配给需要订阅事件域中主题的用户。 将每个角色分配的范围限定为用户需要订阅的主题。 有关这些角色的信息,请参阅事件网格的内置角色。
订阅事件域内的主题
订阅事件域中主题的事件与创建自定义主题的事件订阅或订阅 Azure 服务中的事件相同。
重要
域主题是事件网格中的 自动管理 资源。 可以在 域范围内 创建事件订阅,而无需先创建域主题。 在这种情况下,事件网格会自动代表你创建域主题。 还可以选择手动创建域主题。 此行为可减少在使用大量域主题时必须管理的资源数。 删除域主题的最后一个订阅时,也会删除域主题,而不考虑是手动创建还是自动创建域主题。
域范围订阅
事件域还支持域范围订阅。 事件域范围内的事件订阅接收发送到事件域的所有事件,而不管事件发送到哪个主题。 域范围内的订阅适用于管理和审计场景。
发布到事件域
创建事件域时,事件网格提供类似于自定义主题终结点的发布终结点。 若要将事件发布到事件域中的任何主题,请以 与自定义主题相同的方式将事件推送到事件域终结点。 唯一的区别在于,必须指定事件应传递到的主题。 例如,发布以下事件数组会将带有 "id": "1111" 的事件发送到主题 foo,并将带有 "id": "2222" 的事件发送到主题 bar。
注意
事件域不支持将事件发送到事件域的广播方案,并且域中的每个主题都会收到事件的副本。 发布事件时,发布者必须在要发布到的事件域中指定目标主题。 若要将相同的事件有效负载发布到事件域中的多个主题,发布者必须复制事件有效负载,更改每个副本的主题名称,并使用事件域终结点单独或作为批处理将其发布到事件网格。
使用 云事件架构时,将事件域中的事件网格主题的名称指定为属性的值 source 。 在以下示例中,对于第一个事件,source 属性设置为 foo;对于第二个事件,设置为 bar。
若要使用其他字段在事件域中指定目标主题,请在创建事件域时配置输入架构映射。 对于 REST API,请使用 properties.inputSchemaMapping 属性将该字段映射到 properties.topic。 对于 .NET SDK,请使用 EventGridJsonInputSchemaMapping。 其他 SDK 还支持架构映射。
[{
"source": "foo",
"id": "1111",
"type": "maintenanceRequested",
"subject": "myapp/vehicles/diggers",
"time": "2018-10-30T21:03:07+00:00",
"data": {
"make": "Contoso",
"model": "Small Digger"
},
"specversion": "1.0"
},
{
"source": "bar",
"id": "2222",
"type": "maintenanceCompleted",
"subject": "myapp/vehicles/tractors",
"time": "2018-10-30T21:04:12+00:00",
"data": {
"make": "Contoso",
"model": "Big Tractor"
},
"specversion": "1.0"
}]
事件域会为你处理向主题发布的操作。 你无需将事件逐个发布到每个主题,而是将所有事件发布到事件域终结点,Event Grid 会将每个事件路由到正确的主题。
活动域名定价
事件域使用与事件网格中的其他功能相同的 操作定价 。 操作在事件域中的工作方式与在自定义主题中的工作方式相同:
- 事件每进入事件域一次,均算作一次操作。
- 对于一个事件,每次投递尝试都算作一次操作。
相关内容
若要了解有关设置事件域、创建主题、创建事件订阅和发布事件的信息,请参阅管理事件域。