作用
异步,削峰,解耦
- 解耦
基于其发布/订阅消息模式
- 异步
将和本次请求无关的任务,丢在消息队列中,让消费这自行消费,提高接口响应速度.
- 削峰
在流量高峰期通过堆积消息缓解服务器瞬间压力,在低峰期再从消息队列中慢慢消费以实现削峰.
缺点
- 系统可用性降低 MQ挂了就GG
- 导致系统要考虑的问题变多,进而导致复杂系统的复杂性变高,例如重复消息,消息顺序变化
- 一致性问题
落地产品
- activemq 不太活跃了
- rabbitmq 中小型
- rockertmq 中大型
- kafka 大数据领域,专业,业界标准
如何保证高可用
- rabbitMQ
- 单机模式
- 普通集群模式
不同节点部署在不同机器上,在节点之间可以进行通信,以至于消费者可以连接任意一个节点,然后可以获取到任意一个节点上的数据,
缺点:可能会产生大量的节点之间的通信,节点挂时数据丢失
- 镜像集群模式
每个节点上都会有完整的queue数据,所以叫做镜像模式,可以从任意一个节点消费消息,所有任何一个节点挂掉,其他节点都保存的有完整的数据,从而是高可用的. 可以去其他正常的节点上获取数据,它不是分布式的.会导致非常消耗存储空间.
- kafka
分布式部署模式实现分布式,主从模式实现高可用,在leader宕机后会选择新的flower成为新的leader.
如何保证消息消费的幂等性
每条消息会有一个offset属性类似于消息的序号,消费者消费后会提交消费完成的offset.标识.消费者是定时定量的提交一次offset,如果在消费后未提交offset,时系统发生了重启,那么会出现重复消费消息的情况.
- 幂等性: 多次重复操作,不影响结果.
- 通过数据唯一键
如何保证可靠性传输
MQ
- 生产者
- 在发送消息的方法中加上事务,但是是同步的方法,会发生吞吐量降低
- confirm机制: 异步机制,吞吐量略高.推荐使用
- channel 设置成confirm模式
- 发送了一个消息
- 发送完成后不用管了
- 如果rabbitmq接收到了消息,就会回调你生产者本地的一个接口,通知你消息已经收到了.
- rabbitmq如果在接收消息时发生了错误.也会回调接口通知接收失败,可以重试发送
- rabbitmq本身
将消息持久化到硬盘 步骤:1. 将queue设置未持久化 2. 将消息的deliveryModel设置未2,使用其持久化数据的功能.
- 消费者丢消息
在打开autoAck时,会提前确认消息消费了(消息未消费完成), 建议关闭autoaAck . 自己在消息消费完成后手动确认确认消息消费成功.
KAFKA
- 消费者: 关闭自动提交offset.自己在消息消费完成后手动提交offset
如何保证顺序
- 让需要保证顺序的数据发送同一个queue中,并且这个queue只有一个消费者.
消息积压怎么办?
- 修复消费者
- 新建一个topic 包含十倍的partion
- 让消费者消费到的数据转移到新的topic里面去.
- 然后用更多的消费者去消费新的topic里面的消息,快速消费数据.
- 不设置过期时间,如果丢数据,从源头补偿数据