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)

总线上的各应用基于通用协议进行集成,各应用遵循通用共享模式的消息,包括数据类型,发送的消息可能仅被传递(广播)到所有连接的系统

image-20231231131010961

消息代理(message broker)

也叫hub(broker)和spoke(应用接入broker的组件)架构
各应用基于中央的broker连接,无需对各应用强制执行通用api(消息模式)
支持使用不同的消息连接到broker,broker了解消息模式以及其他目的地

image-20231231131022512

事件:

事件是一段不可变小段数据,记录系统在特定时间内的特定行为,或状态的转变,通过读取系统的事件流(序列),可以重建系统的运行历史(类似mysql的事物日志)

事件通常用于后端代码中,负责连接不同的子系统,每个代码块的状态变动会触发另一个代码块运行

事件格式:

格式可以由开发者自行决定,所以cncf考虑到此,推出cloudEvents规范(用于规范化event),目前大多云厂商都支持此规范

事件驱动(EDA):

不存在1个规范、严格的定义,然和使用事件通知范式(pub/sub)的系统都是事件驱动的系统

事件驱动分类:

  • 响应式(reactive):本质上是非同步性质的函数调用(http Restful/RPC 调用)
  • 流处理式(stream processing):密集型、面向数据式使用事件,订阅者一般是流处理器,它从事件中提取状态,并将状态传递相关方
事件驱动通用架构:
  • 生产者
  • 消费者
  • 消息总线

事件源(event sourcing):

  • 事件数据的持久化模式,一般指事件日志保存不可变的事件信息

image-20231228155213065

cloudevents

cncf独立沙箱项目,用于分布式环境,帮助解耦部署分布式系统,规范事件

cloudevents事件

事件包括某个实际情景(occurrence)的上下文和数据,以及1个唯一标识

事件源(source)生成的事件(event)被封装在协议种,生成传输单元(message)以便传输到达目标端,再触发基于事件数据的动作(action)

image-20231231133032544

传输协议

  • 标准协议:http、amqp、mqtt、smtp等
  • 开源协议:kafka、nats
  • 平台、供应商特有协议

动作:一般由特定来源的特定事件触发,这些代码可运行在serverless中

格式

cloudevent core规范包含一组称为属性的元数据,用于指明如何在系统间传输事件,以及这些元数据应如何出现在消息数据中

image-20231231133258054

序列化规范

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":"..."
  }
}
posted @ 2024-01-02 15:52  suyanhj  阅读(43)  评论(0编辑  收藏  举报