发现事件架构
Azure 事件网格支持两种类型的事件架构:事件网格事件架构和云事件架构。 事件包含一组四个所需字符串属性。 这些属性对于来自任何发布者的所有事件都是通用的。
数据对象具有特定于每个发布者的属性。 对于系统主题,这些属性特定于资源提供程序,例如 Azure 存储或 Azure 事件中心。
事件源将事件以数组的形式发送到 Azure 事件网格,数组可以包含多个事件对象。 将事件发布到事件网格主题时,数组的总大小最多为 1 MB。 数组中的每个事件限制为 1 MB。 如果事件或数组大于大小限制,则会收到响应 413 Payload Too Large。 不过,操作以 64KB 为增量进行收费。 因此,超过 64 KB 的事件会产生操作费用,就像它们是多个事件一样。 例如,一个 130 KB 的事件会产生费用,就像它是三个单独的事件一样。
事件网格将事件发送给具有单个事件的阵列中的订阅者。 可以在事件架构存储中找到事件网格事件的 JSON 架构和每个 Azure 发布服务器的数据负载。
事件架构
以下示例显示所有事件发布者使用的属性:
[
{
"topic": string,
"subject": string,
"id": string,
"eventType": string,
"eventTime": string,
"data":{
object-unique-to-each-publisher
},
"dataVersion": string,
"metadataVersion": string
}
]
事件属性
所有事件都具有以下相同的顶级数据:
| 资产 | 类型 | 必选 | DESCRIPTION |
|---|---|---|---|
| 主题 | 字符串 | 否。 如果不包含,事件网格会标记到事件上。 如果包含,它必须与事件网格主题 Azure 资源管理器 ID 完全匹配。 | 事件源的完整资源路径。 此字段不可写入。 事件网格提供此值。 |
| 主题 | 字符串 | 是的 | 定义了发布者的事件主题路径。 |
| 事件类型 | 字符串 | 是的 | 该事件源的其中一种注册事件类型。 |
| eventTime | 字符串 | 是的 | 事件生成的时间是基于提供者的 UTC 时间。 |
| id | 字符串 | 是的 | 事件的唯一标识符。 |
| 数据 | 对象 | 否 | 特定于资源提供程序的事件数据。 |
| dataVersion | 字符串 | 否。 如果未包含,它将被标记为空值。 | 数据对象的架构版本。 发布者定义架构版本。 |
| metadataVersion | 字符串 | 否。 如果不包含,事件网格会标记到事件上。 如果包含,必须与事件网格架构 metadataVersion 完全匹配(目前,仅匹配 1)。 |
事件元数据的架构版本。 事件网格定义顶级属性的架构。 事件网格提供此值。 |
对于自定义主题,事件发布者确定数据对象。 顶级数据应与标准资源定义事件具有相同的字段。
将事件发布到自定义主题时,请为事件创建主题,以便让订阅者知道他们是否对该事件感兴趣。 订阅者使用主题来筛选和路由事件。 请考虑提供事件发生位置的路径,以便订阅者可以按该路径的段进行筛选。 路径允许订阅者对事件进行狭义或广义的筛选。 例如,如果在主题中提供一个由三个片段构成的路径(如 /A/B/C),订阅者可根据第一个片段 /A 进行筛选,获取范围较宽泛的一组事件。 这些订阅者会获取主题为 /A/B/C 或 /A/D/E 这样的事件。 其他订阅者可通过 /A/B 进行筛选,这样可以获取范围更精确的一组事件。
有时你的主题需要包含所发生事情的详细信息。 例如,将文件添加到容器时,“存储帐户”发布服务器提供主题 /blobServices/default/containers/<container-name>/blobs/<file>。 订阅者可以按路径 /blobServices/default/containers/testcontainer 进行筛选,获取有关该容器而非存储帐户中其他容器的所有事件。 订阅者还可通过使用后缀 .txt 进行筛选或路由,来达到仅处理文本文件的目的。
云事件架构
除了默认事件架构之外,Azure 事件网格还原生支持 CloudEvents v1.0 和 HTTP 协议绑定的 JSON 实现中的事件。 CloudEvents 是描述事件数据的开放规范。
CloudEvents 提供的常用事件架构适合发布和使用基于云的事件,因此可简化互操作性。 可以通过此架构使用统一的工具、以标准方式路由和处理事件,以及以通用方式反序列化外部事件架构。 使用通用架构可以更轻松地跨平台集成工作。
下面是 CloudEvents 格式的 Azure Blob 存储事件示例:
{
"specversion": "1.0",
"type": "Microsoft.Storage.BlobCreated",
"source": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}",
"id": "9aeb0fdf-c01e-0131-0922-9eb54906e209",
"time": "2019-11-18T15:13:39.4589254Z",
"subject": "blobServices/default/containers/{storage-container}/blobs/{new-file}",
"dataschema": "#",
"data": {
"api": "PutBlockList",
"clientRequestId": "4c5dd7fb-2c48-4a27-bb30-5361b5de920a",
"requestId": "9aeb0fdf-c01e-0131-0922-9eb549000000",
"eTag": "0x8D76C39E4407333",
"contentType": "image/png",
"contentLength": 30699,
"blobType": "BlockBlob",
"url": "https://gridtesting.blob.core.windows.net/testcontainer/{new-file}",
"sequencer": "000000000000000000000000000099240000000000c41c18",
"storageDiagnostics": {
"batchId": "681fe319-3006-00a8-0022-9e7cde000000"
}
}
}
此处提供 CloudEvents v1.0 中的可用字段、类型和定义的详细说明。
在 CloudEvents 架构和事件网格架构中传递的事件的标头值是相同的,但 content-type 除外。 对于 CloudEvents 架构,该标头值为 "content-type":"application/cloudevents+json; charset=utf-8"。 对于事件网格架构,该标头值为 "content-type":"application/json; charset=utf-8"。
可以将事件网格用于 CloudEvents 架构的事件的输入和输出。 可以将 CloudEvents 用于系统事件(例如 Blob 存储事件和 IoT 中心事件)和自定义事件。 它还可以将网络上的这些事件来回转换。