消息中间件的核心组成部分
- 消息队列协议
- 消息的持久化机制
- 消息的分发策略
- 消息的高可用,高可靠
- 消息的容错机制
一、消息队列协议
共同遵循的约定和规范,目的是让客户端进行通讯,并且该协议下必须高可用,高可靠,持久化
协议三要素
- 语法 规定请求头和响应头
- 语义 客户端主动发送请求,使用什么方式(POST/GET)
- 时序 一个请求必定有一个响应
常见协议(消息组件)
- OpenWire
- AMQP
- MQTT
- Kafka
- OpenMessage
AMQP
Advanced Message Queuing Protocol
Spring一家,Erlang开发
特性:
- 分布式事务支持
- 消息的持久化支持
- 高性能,高可靠的消息处理优势
RabbitMQ和ActiveMQ都支持该协议,RabbitMQ更加优秀
MQTT
物联网系统架构的重要组成部分
Message Queuing Telemetry Transport
特性:
- 轻量级
- 结构简单
- 传输快,不支持事务
- 没有持久化设计
应用场景
- 适用于计算能力有限
- 低带宽
- 网络不稳定
RabbitMQ和ActiveMQ都支持该协议,需要手动打开
OpenMessage
由国内各大公司 阿里,雅虎,滴滴进行开发维护的协议
特性:
- 结构简单
- 解析速度快
- 支持事务和持久化
RocketMQ支持
Kafka
基于TCP/IP的二进制协议,消息内部通过长度进行分割,由一些基本数据类型组成
特性:
- 结构简单
- 解析速度快
- 无事务支持
- 有持久化设计
二、消息队列持久化
持久化:将数据存储到磁盘,使数据永久保存
常见持久化方式
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|---|
文件存储 | 支持 | 支持 | 支持 | 支持 |
数据库 | 支持 | / | / | / |
数据库持久化不优雅,极少使用
三、消息队列分发策略
MQ角色
- 生产者
- 存储消息
- 消费者
消息队列MQ是一种推(PUSH)的机制
分发策略机制和对比
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|---|
发布订阅 | 支持 | 支持 | 支持 | 支持 |
轮询分发 | 支持 | 支持 | 支持 | / |
公平分发 | / | 支持 | 支持 | / |
重发 | 支持 | 支持 | / | 支持 |
消息拉取 | / | 支持 | 支持 | 支持 |
例子:
生产者生产了100条消息
- 发布订阅: 所有消费者都会收到100条
- 轮询分发: 公平性,无论服务器性能如何,不会进行服务器资源倾斜,数据被消费者消费,其他消费者不会再次进行消费
- 公平分发:数据倾斜(能者多劳,手动实现),根据服务器性能进行分发,数据被消费者消费,其他消费者不会再次进行消费
- 重发:出现异常故障,消息没有得到应答,重发到其他集群服务器,直到得到响应
- 消息拉取:进行消息拉取
四、消息高可用和高可靠
什么是高可用
产品在规定的条件和规定的时间内处于可执行规定功能状态的能力
当业务量增加时,请求也会增加,一台消息中间件服务器会达到物理极限,通常需要部署集群,来达到高可用的目的
什么是高可靠
系统可以无故障的持续运行,比如一个系统突然本库,报错,异常等不会影响线上业务的正常运行,出错的几率极低,
可以从两方面考虑消息中间件的可靠性:
master负责写入数据,slave负责读取数据
master节点宕机,slave节点继续服务,从而形成高可用
不会形成消息副本
集群模式-2-Master - Slave(主从同步部署)
master写入消息,主节点会同步数据到slave节点形成副本,可以达到负载均衡的效果,消息的拷贝和同步会暂用很大的带宽和网络资源
最好部署在同一个局域网内
集群模式-3-多主集群同步部署
任意节点获取,任意节点写入
集群模式-4-多主集群转发部署
使用较多,将消息描述信息和存放位置放入元数据,
解释:如果你插入的数据是broker-1中,元数据信息会存储数据的相关描述和记录存放的位置(队列)。
它会对描述信息也就是元数据信息就行同步,如果消费者在broker-2中进行消费,发现自己几点没有对应的消息,可以
从对应的元数据信息中去查询,然后返回对应的消息信息,场景:比如买火车票或者黄牛买演唱会门票,比如第一个黄
牛有顾客说要买的演唱会门票,但是没有但是他会去联系其他的黄牛询问,如果有就返回。
集群模式-5- Master-slave 与 Broker-cluster组合的方案
大型系统中使用
根据系统需求和业务场景选择模式
- 要么消息共享
- 要么消息同步
- 要么元数据共享
五、消息类型
- 普通消息:消息队列中无特性的消息
- 事务消息:先发送消息,等待当前微服务业务执行完毕之后再次传递确认消息,才会将消息传递给下一个微服务,实现类似于X/OpenXA的分布式事务功能,已达到食物最终一致性状态
- 定时和延时消息:允许消息生产者对指定消息进行定时投递,最长支持40天
- 顺序消息:允许消费者按照消息发送的顺序对消息进行消费