knative之eventing消息与事件基础概念
消息与事件基础概念
详细内容应参考消息队列服务,可以参考博主的kafka、rabbitmq内容
消息
消息本身是一种数据结构,可以是字符串、字节数组、记录、对象等,简单理解就是数据
一般消息通常指请求中body
部分,消息总共有2部分组成:
- header:元数据,用于记录发送方和接收方,通常是由消息传递系统系统,接收方忽略此部分
- body:数据本身,接收方使用的内容,消息传递系统忽略此部分
消息传递
消息传递是指程序和程序间实现高速、异步、可靠传递数据的技术,程序间发送message的数据包进行通信,消息传递系统包含以下几个概念:
- 通道(channel):也叫队列(queue),连接程序和传递消息的逻辑路径,channel的特性类似消息的集合或数组,可实现多计算机共享
- 发送者(sneder)或生产者(producer):消息生产方
- 接收者(receiver)或消费者(consumer):消息接收方,从通道去读或删除消息
优劣势:
优势都是熟知的,劣势如下
- 复杂的编程模型:开发人员需要使用事件驱动编程模型,需要用到请求消息、请求通道、响应消息、响应通道等
- 顺序问题:消息通道要保证消息传递,但不保证消息的顺序
- 不适用同步通信的场景
消息传递系统
消息中间件,具体内容参考rabbitmq、kafka等
传递模式:
-
1v1
-
1vN:一般是pub/sub(生产者和订阅者),一个输入通道,多个输出通道,每个订阅者对应一个输出通道
- 过滤器:筛选符合条件的消息
- 路由器:将过滤器选出的消息路由到目标通道
消息拓扑
消息系统的架构模式,2种主流拓扑:消息总线和消息代理
消息总线(message bus)
总线上的各应用基于通用协议进行集成,各应用遵循通用共享模式的消息,包括数据类型,发送的消息可能仅被传递(广播)到所有连接的系统
消息代理(message broker)
也叫hub(broker)和spoke(应用接入broker的组件)架构
各应用基于中央的broker连接,无需对各应用强制执行通用api(消息模式)
支持使用不同的消息连接到broker,broker了解消息模式以及其他目的地
事件:
事件是一段不可变小段数据,记录系统在特定时间内的特定行为,或状态的转变,通过读取系统的事件流(序列),可以重建系统的运行历史(类似mysql的事物日志)
事件通常用于后端代码中,负责连接不同的子系统,每个代码块的状态变动会触发另一个代码块运行
事件格式:
格式可以由开发者自行决定,所以cncf考虑到此,推出cloudEvents规范(用于规范化event),目前大多云厂商都支持此规范
事件驱动(EDA):
不存在1个规范、严格的定义,然和使用事件通知范式(pub/sub)的系统都是事件驱动的系统
事件驱动分类:
- 响应式(reactive):本质上是非同步性质的函数调用(http Restful/RPC 调用)
- 流处理式(stream processing):密集型、面向数据式使用事件,订阅者一般是流处理器,它从事件中提取状态,并将状态传递相关方
事件驱动通用架构:
- 生产者
- 消费者
- 消息总线
事件源(event sourcing):
- 事件数据的持久化模式,一般指事件日志保存不可变的事件信息
cloudevents
cncf独立沙箱项目,用于分布式环境,帮助解耦部署分布式系统,规范事件
cloudevents事件
事件包括某个实际情景(occurrence)的上下文和数据,以及1个唯一标识
事件源(source)生成的事件(event)被封装在协议种,生成传输单元(message)以便传输到达目标端,再触发基于事件数据的动作(action)
传输协议
- 标准协议:http、amqp、mqtt、smtp等
- 开源协议:kafka、nats
- 平台、供应商特有协议
动作:一般由特定来源的特定事件触发,这些代码可运行在serverless中
格式
cloudevent core规范包含一组称为属性的元数据,用于指明如何在系统间传输事件,以及这些元数据应如何出现在消息数据中
序列化规范
cloudevent提供了将多种格式和协议:json、http、amqp、kafka等序列化的规范
http消息映射方法1:
- 标头Content-Type: application/json; charset=utf-8,此标头负责数据类型
- body部分:代表data数据
- 其他属性字段:必须各自映射为标头中以ce-开头,如:ce-id、ce-type
常见属性字段:
- id: str
- type: str //消息类型
- time: str
- source: str/url
- specversion: str //规范版本
- datacontenttype: str
- data: {}
Host: 域名
ce-specversion: 1.0
ce-type: com.magedu.someevent
ce-time: 2022-02-18T03:56:24Z
ce-id: 1234-5678-8765-4321
ce-source: /mycontext/subcontext
Content-Type: application/json; charset=utf-8
Content-Length: 字节数
{
... application data ...
}
http消息映射方法2:
- 标头Content-Type: application/cloudevents-json
- 其他部分:以json格式的body数据提供
Host: event-display.magedu.com
Content-Type: application/cloudevents+json
{
"specversion":"1.0",
"type":"...",
"source":"...",
"id":"...",
"data":{
"msg":"..."
}
}