你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 事件网格命名空间 - 支持 CloudEvents 架构

事件网格命名空间主题接受符合云原生计算基础 (CNCF) 开放标准 CloudEvents 1.0 规范的事件,该规范使用 JSON 格式HTTP 协议绑定。 CloudEvent 是一种消息,包含要传递的内容(称为事件数据)和相关元数据。 事件驱动体系结构中的事件数据通常携带宣告系统状态更改的信息。 CloudEvents 元数据由一组属性构成,这些属性提供有关消息的上下文信息,例如消息来源(源系统)、其类型等。符合 CloudEvents 规范的所有有效消息必须包含以下必需的上下文属性

CloudEvents 规范还定义了使用事件网格时可包含的可选的扩展上下文属性

使用事件网格时,CloudEvents 是首选事件格式,因为它具有详细记录的用例(传输事件的模式事件格式等)、扩展性和改进的互操作性。 CloudEvents 通过提供用于发布和使用事件的通用事件格式来提高互操作性。 它允许使用统一的工具和标准方式来路由和处理事件。

CloudEvents 内容模式

CloudEvents 规范定义了三种内容模式二进制结构化批量

重要

在任何内容模式下均可交换文本(JSON、text/* 等)或二进制编码事件数据。 二进制内容模式并不专用于发送二进制数据。

内容模式并非关于所使用的编码、二进制或文本,而是关于事件数据及其元数据的描述和交换方式。 结构化内容模式使用单个结构,例如一个 JSON 对象,其 HTTP 有效负载中同时存在上下文属性和事件数据。 二进制内容模式会将上下文属性(映射到 HTTP 标头)和事件数据(根据 Content-Type 中设置的媒体类型编码的 HTTP 有效负载)分隔。

CloudEvents 支持

此表显示了当前对 CloudEvents 规范的支持:

CloudEvents 内容模式 是否支持?
结构化 JSON
结构化 JSON 批处理 支持,用于发布事件
二进制 支持,用于发布事件

一个事件允许的最大大小为 1 MB。 超过 64 KB 的事件以 64 KB 为增量计费。

结构化内容模式

CloudEvents 结构化内容模式下的消息其 HTTP 有效负载中同时存在上下文属性和事件数据。

重要

目前,事件网格支持 CloudEvents JSON 格式的 HTTP。

下面是结构化模式下使用 JSON 格式的 CloudEvents 示例。 元数据(非“数据”的所有属性)和消息/事件数据(“数据”对象)都使用 JSON 来描述。 我们的示例涵盖了所有必需的上下文属性以及一些可选属性(subjecttimedatacontenttype)和扩展属性(comexampleextension1comexampleothervalue)。

{
    "specversion" : "1.0",
    "type" : "com.yourcompany.order.created",
    "source" : "/orders/account/123",
    "subject" : "O-28964",
    "id" : "A234-1234-1234",
    "time" : "2018-04-05T17:31:00Z",
    "comexampleextension1" : "value",
    "comexampleothervalue" : 5,
    "datacontenttype" : "application/json",
    "data" : {
       "orderId" : "O-28964",
       "URL" : "https://com.yourcompany/orders/O-28964"
    }
}

可以将 JSON 格式与结构化内容结合使用,以发送非 JSON 值的事件数据。 为此,执行以下步骤:

  1. 包含一个 datacontenttype 属性,该属性采用数据编码时采用的媒体类型。
  2. 如果该媒体类型采用文本格式(如 text/plaintext/csvapplication/xml)进行编码,应结合使用 data 属性和一个包含通信内容作为值的 JSON 字符串。
  3. 如果该媒体类型表示二进制编码,应使用 data_base64 属性,其值是包含 BASE64 编码二进制值的 JSON 字符串

例如,此 CloudEvent 携带采用 application/protobuf 编码的事件数据,用以交换 Protobuf 消息。

{
    "specversion" : "1.0",
    "type" : "com.yourcompany.order.created",
    "source" : "/orders/account/123",
    "id" : "A234-1234-1234",
    "time" : "2018-04-05T17:31:00Z",
    "datacontenttype" : "application/protobuf",
    "data_base64" : "VGhpcyBpcyBub3QgZW5jb2RlZCBpbiBwcm90b2J1ZmYgYnV0IGZvciBpbGx1c3RyYXRpb24gcHVycG9zZXMsIGltYWdpbmUgdGhhdCBpdCBpcyA6KQ=="
}

有关 datadata_base64 属性用法的详细信息,请参阅数据处理

有关此内容模式的详细信息,请参阅 cloudEvents HTTP 结构化内容模式规范

批量内容模式

事件网格当前支持在将 CloudEvents 发布到事件网格时使用 JSON 批量内容模式。 此内容模式使用由结构化内容模式的 CloudEvents 填充的 JSON 数组。 例如,应用程序可使用类似于以下的数组发布两个事件。 同样,如果使用事件网格的数据平面 SDK,则此有效负载也属于要发送的内容:

[
    {
        "specversion": "1.0",
        "id": "E921-1234-1235",
        "source": "/mycontext",
        "type": "com.example.someeventtype",
        "time": "2018-04-05T17:31:00Z",
        "data": "some data"
    },
    {
        "specversion": "1.0",
        "id": "F555-1234-1235",
        "source": "/mycontext",
        "type": "com.example.someeventtype",
        "time": "2018-04-05T17:31:00Z",
        "data": {
            "somekey" : "value",
            "someOtherKey" : 9
        }
    }
]

有关详细信息,请参阅 CloudEvents 批量内容模式规范。

批处理

应用程序应在一个数组中统一批处理多个事件,以便通过单个发布请求获得更高的效率和更高的吞吐量。 批最大可以为 1 MB,事件的最大大小为 1 MB。

二进制内容模式

二进制内容模式下的 CloudEvent 的上下文属性描述为 HTTP 标头。 HTTP 标头的名称是带有 ce- 前缀的上下文属性的名称。 Content-Type 标头反映事件数据编码时采用的媒体类型。

重要

使用二进制内容模式时,不能同时存在 ce-datacontenttype HTTP 标头。

重要

如果计划在使用二进制内容模式时包含自己的属性(即扩展属性),请确保其名称由 ASCII 字符中的小写字母(“a”到“z”)或数字(“0”到“9”)组成,且长度不超过 20 个字符。 也即,用于命名 CloudEvents 上下文属性的命名约定比有效 HTTP 标头名的命名约定更严格。 并非每个有效 HTTP 标头名都是有效的扩展属性名称。

HTTP 有效负载是根据 Content-Type 中的媒体类型编码的事件数据。

用于发布内容二进制模式的 CloudEvent 的 HTTP 请求如下例所示:

POST / HTTP/1.1
HOST mynamespace.eastus-1.eventgrid.azure.net/topics/mytopic
ce-specversion: 1.0
ce-type: com.example.someevent
ce-source: /mycontext
ce-id: A234-1234-1234
ce-time: 2018-04-05T17:31:00Z
ce-comexampleextension1: value
ce-comexampleothervalue: 5
content-type: application/protobuf

Binary data according to protobuf encoding format. No context attributes are included.

何时使用 CloudEvents 的二进制或结构化内容模式

如果希望通过简单的方法来跨跃点和协议转发 CloudEvent,可以使用结构化内容模式。 由于结构化内容模式下的 CloudEvent 同时包含了消息和元数据,客户端可轻松将其作为一个整体使用并将其转发到其他系统。

如果已知下游应用程序只需要消息而无需任何额外信息(即上下文属性),则可以使用二进制内容模式。 虽然使用结构化内容模式时仍可从 CloudEvent 中获取事件数据(消息),但将数据置于 HTTP 有效负载中对于使用数据的应用程序而言会更轻松。 例如,其他应用程序可以使用其他协议,并可能只需要核心消息而无需其元数据。 事实上,元数据可能仅与紧接的第一个跃点相关。 在这种情况下,将要交换的数据与其元数据分离有助于更轻松地处理和转发数据。