Azure 事件网格事件架构

本文介绍了事件网格架构,它是一种专有、不可扩展且功能齐全的事件格式。 事件网格仍支持此事件格式,并将继续支持它。 但建议使用 CloudEvents 事件格式。 如果使用的是使用事件网格格式的应用程序,则可以在描述事件网格支持的事件网格和 CloudEvents 格式之间转换的 [CloudEvents] 部分中找到有用的信息。

本文详细介绍了事件网格格式的属性和架构。 事件包含一组四个所需字符串属性。 这些属性在任何发布服务器的所有事件中通用。 数据对象具有特定于每个发布者的属性。 对于系统主题,这些属性特定于资源提供程序,例如 Azure 存储或 Azure 事件中心。

事件源会将事件发送到数组中的 Azure 事件网格(其中可包含多个事件对象)。 将事件发布到事件网格主题时,数组的总大小最大可为 1 MB。 数组中的每个事件被限制为 1 MB。 事件或数组超出大小限制时会收到响应“413 有效负载太大”。 不过,操作以 64KB 为增量进行收费。 因此,超过 64 KB 的事件会产生操作费用,就像它们是多个事件一样。 例如,大小为 130KB 的事件产生的操作就像它是 3 个不同的事件一样。

事件网格会将事件发送给具有单个事件的数组中的订阅者。 此行为在将来可能会更改。

可以在事件架构存储中找到事件网格事件的 JSON 架构和每个 Azure 发布服务器的数据负载。

事件架构

以下示例显示所有事件发布者使用的属性:

[
  {
    "topic": string,
    "subject": string,
    "id": string,
    "eventType": string,
    "eventTime": string,
    "data":{
      object-unique-to-each-publisher
    },
    "dataVersion": string,
    "metadataVersion": string
  }
]

例如,为 Azure Blob 存储事件发布的架构是:

[
  {
    "topic": "/subscriptions/{subscription-id}/resourceGroups/Storage/providers/Microsoft.Storage/storageAccounts/xstoretestaccount",
    "subject": "/blobServices/default/containers/oc2d2817345i200097container/blobs/oc2d2817345i20002296blob",
    "eventType": "Microsoft.Storage.BlobCreated",
    "eventTime": "2017-06-26T18:41:00.9584103Z",
    "id": "831e1650-001e-001b-66ab-eeb76e069631",
    "data": {
      "api": "PutBlockList",
      "clientRequestId": "6d79dbfb-0e37-4fc4-981f-442c9ca65760",
      "requestId": "831e1650-001e-001b-66ab-eeb76e000000",
      "eTag": "0x8D4BCC2E4835CD0",
      "contentType": "application/octet-stream",
      "contentLength": 524288,
      "blobType": "BlockBlob",
      "url": "https://oc2d2817345i60006.blob.core.chinacloudapi.cn/oc2d2817345i200097container/oc2d2817345i20002296blob",
      "sequencer": "00000000000004420000000000028963",
      "storageDiagnostics": {
        "batchId": "b68529f3-68cd-4744-baa4-3c0498ec19f0"
      }
    },
    "dataVersion": "",
    "metadataVersion": "1"
  }
]

事件属性

所有事件均具有以下相同的顶级数据:

属性 类型 必需 说明
topic string 否,但如果包含,则必须与事件网格主题 Azure 资源管理器 ID 完全匹配。 如果不包含,事件网格会标记到事件上。 事件源的完整资源路径。 此字段不可写入。 事件网格提供此值。
subject 字符串 事件主题的发布者定义路径。
eventType string 此事件源的一个注册事件类型。
EventTime 字符串 基于提供程序 UTC 时间的事件生成时间。
id 字符串 事件的唯一标识符。
data object 特定于资源提供程序的事件数据。
dataVersion string 否,但将使用空值进行标记。 数据对象的架构版本。 发布者定义架构版本。
metadataVersion string 不是必需的,但如果包含,则必须与事件网格架构 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 进行筛选或路由,来达到仅处理文本文件的目的。

CloudEvents

建议使用 CloudEvents 事件格式。 Azure 事件网格将会继续投资于至少与 CloudEvents JSON 格式相关的功能。 鉴于某些事件源(如 Azure 服务)使用事件网格的格式,下表将有助于你了解将 CloudEvents 和事件网格格式用作主题中的输入架构以及事件订阅中的输出架构时支持的转换。 将 CloudEvents 用作输入架构时,无法使用事件网格输出架构,因为 CloudEvents 支持事件网格架构不支持的扩展属性

输入架构 输出架构
CloudEvents 格式 CloudEvents 格式
事件网格格式 CloudEvents 格式
事件网格格式 事件网格格式

后续步骤