发现事件架构

已完成

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 中心事件)和自定义事件。 它还可以将网络上的这些事件来回转换。