MQ
常用协议
AMQP
提供统一消息服务的应用层标准高级消息队列协议,是一个应用层开放标准。
MQTT
消息队列遥测传输,即时通讯协议,物联网
STOMP
流文本定向消息协议
XMPP
可拓展消息处理现场协议,多用于IM即时消息以及在线现场探测,基于XML传输
其他基于TCP/IP自定义
组成
- Broker:消息服务器
- Producer:生产者
- Consumer:消费者
- Topice:主题,消息统一汇集地
- Queue:队列
- Message:消息体
模式分类
点对点
一个消息只有一个消费者,消费即消失
发布/订阅
同时有多个消费者消费该消息。但是一个消息只能被一个消费者接受,当没有消费者可用时,消息一直保存直到消费
优点
解耦
降低系统之间的关联度耦合度,降低容错性
异步
削峰
缺点
降低高可用
系统引入的外部依赖越多,越容易挂掉。引入MQ,若MQ挂掉,整个系统也挂了
集群
- RabbitMQ:镜像集群
- RocketMQ:双主双从
增加系统复杂程度
要考虑到保证消息的准确性。不被重复消费,消息丢失,传递顺序
一致性问题
多个请求,其中一个修改数据失败,数据不统一
消息丢失
- 设置持久化
- 交换器持久化
- 队列持久化
- ack确认机制
- 消息发送确认
- 消息接收确认
- 消息补偿机制:消息发送、接收时记录日志,定时轮训日志,查明哪些发送消费没有成功,启动重新发送消息机制
重复消息
-
发送重复消息
-
消费重复消息
- 消费者消费消息但为回馈消息给MQ,MQ又会发送给消费者,此时就造成消息重复
解决办法
保证消息的幂等性,在发送消费的时候在数据库插入一个唯一键,插入相同的数据则不进行操作。
消息顺序
生产者:MQ:消费者=1:1:1
- 消息被发送时保持顺序
- 消息被存储时保持和发送时顺序一致
- 消息被消费时保持和存储时顺序一致
RocketMQ根据消息ID将同一组的消息发送到一个Queue中,消息队列本来就是先进先出,保证了存储顺序一致;又采用分段锁,保证单个Queue中的有序消费
消息过期
设置死信队列,接收过期消息,创建死信消费者消费过期时间
各个MQ的比较
| 特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
|---|---|---|---|---|
| 单机吞吐量 | 万级 | 万级 | 万级 | 十万级 |
| topic数量对吞吐量的影响 | topic可以达到几百几千级别时,有影响 | topic可以达到几百几千级别时,有影响 | ||
| 时效性 | ms级 | 微秒级 | ms级 | ms级 |
| 可用性 | 高,主从 | 高,主从 | 非常高,分布式架构 | 非常高,分布式 |
| 消息可靠性 | 低 | 低 | 理论不丢失 | 理论不丢失 |
| 消息重复性 | 可控制 | 理论不重复 | ||
| 多语言支持 | 支持,JAVA优先 | 语言无关 | 只支持JAVA | 支持,JAVA优先 |
| 持久化 | 内存、文件、数据库 | 内存、文件 | 磁盘文件 |