消息队列个人梳理

147 阅读2分钟

1.应用场景

解耦、异步、流量削峰。

2.引入后的缺点

系统可用性降低。

一旦MQ挂掉不是直接拉跨了。(所以要做高可用,高可用无非就是用集群或备机,双主双从、镜像集群之类的)

系统复杂度提高

比如最主要的消息丢失了怎么办?消息被重复消费如何?怎么保证消费的顺序性?

一致性问题

producer和consumer两端各有自己的本地事务执行,怎么保证一致性?

3.保证高可用

rocketMQ采用双主双从的结构

保存数据的节点被称为broker(有master和slave的分别),其上还有Name Server作为broker的管理者。
broker们会每隔一段时间通过心跳机制把自己的状态同步给name server。
Name server是broker的一个管理者。
producer发消息的时候先问name server,然后nameserver会给一个broker地址,然后producer再发送给broker。

注意broker的从节点是不能接受消息的。

1.生产者通过Name Server发现Broker
2. 生产者发送队列消息到2个Broker主节点
3. Broker主节点分别和各自从节点同步数据
4. 消费者从主或者从节点订阅消息

image.png

rabbitMQ主要使用镜像集群来做高可用

4.保证消息不丢失

4.1 分析丢失的环节

情况一:消息生产者没有成功发送到MQ Broker
情况二:消息发送给MQ Broker后,Broker宕机导致内存中的消息数据丢失
情况三:消费者获取到消息,但消费者还没有来得及处理宕机了,但此时
MQ中消息已经删除,消费者重启后不能再消费之前的消息

image.png

4.2 解决丢失

1. 消息发送者发送给MQ Broker后,MQ Broker给生产者确认收到
2. MQ收到消息后进行消息持久化
3. 消费者收到消息处理完毕后手动进行ack确认
4. MQ收到消费者ack确认后删除持久化的消息

image.png