CloudEvents调研

概述

对事件的统一描述的匮乏意味着开发者必须不断重新学习如何消费不同定义的事件。 它同样限制了那些用来帮助事件数据完成跨环境传输的库(如 SDKs)、工具(如事件路由器)和基础设施(如事件追踪系统)的发展。 总体来看,这种匮乏严重阻碍了事件数据的可移植性和生产力。
CloudEvents 是一个以通用格式来描述事件数据的规范。它提供了事件在服务、平台和系统中的互操作性。
CloudEvents 的核心是定义了一组关于系统间传输事件的元数据(被称为属性),以及这些元数据应该如何出现在消息中。还对如何以不同格式(如 JSON)和协议(如 HTTP、AMQP、Kafka)序列化事件进行了规范。支持这些编码兼容 CloudEvents 的实现必须遵守相应事件格式中指定的编码规则。所有实现都必须支持 JSON 格式。
核心规范:https://github.com/cloudevents/spec/blob/main/cloudevents/languages/zh-CN/spec.md

CloudEventContext元数据

除了事件数据外,有8个元数据属性(其中四个必选属性:id,source,specversion,type,其他为可选属性),和数量不等的自定义属性(extensions)
 
  1. 必要属性

以下属性必须在所有CloudEvents中出现。
id
属性名 id
类型 字符串
描述 标示事件。生产者必须确保 source + id 对于每个独立的事件都是唯一的。如果一个重复的事件被重新发送(例如,由于网络错误),它可能有相同的id。消费者可能会认为 source 和 id 相同的事件是重复的。
约束 1. 必须 2. 必须是一个非空字符串 3.必须在生产者范围内是唯一的
范例 1.由生产者维护的事件计数器 2.UUID
source
属性名 source
类型 URI-reference
描述 标识事件发生的上下文背景。 这通常包括诸如事件源类型、发布事件的组织 或产生事件的过程等信息。URI 中编码的数据背后的确切语法和语义由事件生产者定义。
生产者必须确保每个不同事件的 source + id 是唯一的。
应用程序可以为每个不同的生产者分配一个唯一的 source, 这使得生成唯一 ID 变得容易,因为没有其他生产者将拥有相同的来源。 应用程序可以使用 UUIDs、URNs、DNS权威机构或特定于应用程序的方案来创建唯一的 source 标识符。
一个来源可以包括多个生产者。 在这种情况下,生产者必须协作以确保每个不同事件的 source + id 都是唯一的。
约束 1. 必须 2.必须为非空URI-reference 3.推荐使用绝对URI
范例 1. https://github.com/cloudevents2.mailto:cncf-wg-serverless@lists.cncf.io
2. urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66
3. /cloudevents/spec/pull/1232./sensors/tn-1234567/alertsd.1-555-123-4567
参考下文 URI简介
specversion
属性名 specversion
类型 字符串
描述 事件使用的 CloudEvents 规范的版本。 这让解释上下文环境更容易。 当引用这个版本的规范时,兼容的事件生产者必须使用 1.0 的值
约束 1. 必须 2.必须是一个非空字符串 3.必须在生产者范围内是唯一的
type
属性名 type
类型 字符串
描述 该属性包含一个值,描述与原始事件相关的事件类型。 该属性通常用于路由、可观察性、策略实施等。其格式是生产者定义的,可能包括诸如 type 版本之类的信息。
约束 1. 必须 2.必须是一个非空字符串 3.应该以一个反转的DNS名称为前缀。前缀域决定了定义这个事件类型的语义的组织。
范例 com.github.pull.createb.com.example.object.delete.v2
 
  1. 可选属性

以下为在CloudEvents中出现的可选属性。
datacontenttype
属性名 datacontenttype
类型 字符串
描述 data 值的内容类型。 此属性使 data 能够承载任何类型的内容, 因此格式和编码可能与所选事件格式的不同。 例如,使用 JSON envelope格式呈现的事件可能在数据中携带 XML 的有效负载,这个属性可以用来通知消费者 设置"application/xml"。 关于 data 内容如何提供不同的 datacontenttype 的值的规则在事件格式规范中定义。
在某些事件格式中,可以省略 datacontenttype 属性。 例如,如果 JSON 格式的事件没有 datacontenttype 属性, 则表示该 data 是符合“application/json”媒体类型的 JSON 值。 换句话说:一个没有 datacontenttype 的 JSON 格式的事件完全等同于 一个带有 datacontenttype="application/json" 的事件。
约束 1. 可选 2.如果存在,必须遵守RFC 2046中规定的格式。https://www.rfc-editor.org/rfc/rfc2046 3.默认是 application/json
dataschema
属性名 dataschema
类型 URI
描述 标识 data 遵守的规范。 对模式的不兼容的更改应该由不同的 URI 体现。
约束 1. 可选 2.必须是一个非空字符串
json-schema官方介绍:
https://json-schema.org/learn/getting-started-step-by-step
中文翻译:
https://blog.csdn.net/swe_ling/article/details/123338598
subject
属性名 subject
类型 字符串
描述 这个属性描述了事件生产者 (由 source 标识) 上下文环境中的主题信息。 在发布-订阅场景中,订阅者通常会订阅 source 发出的事件, 但如果 source 的上下文环境具有内部子结构, 则单独的 source 标识符可能不足以作为任何指定事件的限定符。
约束 1.可选 2.必须是一个非空字符串
范例 订阅者可能对在 blob 在 blob 存储容器中创建的时候感兴趣并订阅。 在这个场景下,事件 source 标示出订阅的范围(存储容器),type 标识出 blob 创建" 这个事件,id 唯一标识出事件示例,以区分已创建同名 blob 的事件, 而新创建的 blob 的名字可以放在 subject 属性中:
source: https://example.com/storage/tenant/container
subject: mynewfile.jpg
time
属性名 time
类型 Timestamp
描述 事件发生的时间戳。 如果无法确定发生的时间,则 CloudEvents 生产者可以将此属性设置为其他时间(例如当前时间)。 但是在这方面,同一 source 的所有生产者必须保持一致。 换句话说,要么它们都使用发生的实际时间,要么它们都使用相同的算法来确定所使用的值。
约束 1.必须 2.如果存在,必须遵守RFC 3339中规定的格式。https://rfc2cn.com/rfc3339.html
 
  1. 扩展上下文属性

CloudEvent 可以包含任意数量的具有不同名称的附加上下文属性,被称为“扩展属性"。 扩展属性必须遵循相同的命名约定并使用与标准属性相同的类型系统。 扩展属性在本规范中没有定义好的含义, 它们允许外部系统将元数据附加到事件,就像 HTTP 自定义请求头一样。
许多协议为发送者提供了包含额外元数据的能力,例如作为 HTTP 请求头。 虽然没有强制要求 CloudEvents 接受者处理和传递它们, 但建议接受者通过某种机制进行处理,以明确它们是非 CloudEvents 的元数据。
 
  1. 事件数据

正如数据所定义的那样,CloudEvents 可以包括有关事件的特定域的信息。 这些信息将被封装在 data 中。本规范对该信息的类型不作任何限制。 它被编码为一种媒体格式,这种格式由 datacontenttype 属性(如 application/json)指定,当存在这些相应的属性时,遵循 dataschema 格式。
大小限制:
  • 中间人转发的事件大小必须为 64 KB 或更小。
  • 消费者应该能接受大小至少为 64 KB 的事件。
 

阿里云示例

{
    "data":{
        "meetingName":"swqd",
        "groupId":"456",
        "action":"camera_off",
        "time":1590592527490,
        "userId":"199525",
        "meetingUUID":"hz-20864c8f-b10d-45cd-9935-884bca1b"},"id":"45ef4dewdwe1-7c35-447a-bd93-fab",
    "source":"acs:aliyuncvc",
    "specversion":"1.0",
    "subject":"acs.aliyuncvc:cn-hangzhou:{AccountId}:215672",
    "time":"2020-11-19T21:04:41+08:00",
    "type":"aliyuncvc:MeetingEvent:MemberOperate",
    "aliyunaccountid":"123456789098****",
    "aliyunpublishtime":"2020-11-19T21:04:42.179PRC",
    "aliyuneventbusname":"default",
    "aliyunregionid":"cn-hangzhou",
    "aliyunpublishaddr":"172.25.XX.XX"
}
原文地址:
https://help.aliyun.com/document_detail/181428.html
 

URI简介

统一资源标识符(Uniform Resource Identifier,URI)
统一资源定位符(Uniform Resource Locator,URL),统一资源名称(Uniform Resource Name,URN)都是URI的子集。
RFC 3986定义了URI的规范 (https://rfc2cn.com/rfc3986.html )下面是示例:
 
URI的语法定义如下:
我们业务中设备上报的事件,使用第二种urn规范即可,由内部定义,例如:
urn:com.lingdong.cloudevents:device:topic:type
 
 

JAVA-SDK

官方文档:https://cloudevents.github.io/sdk-java/
支持特性列表
posted @ 2023-02-02 16:59  SonicLi  阅读(177)  评论(0)    收藏  举报