目录
1. RocketMQ如何保证消息的顺序性
1. 为什么会出现乱序(负载均衡)
Broker中的每个Topic都有多个Queue,写入消息的时候会平均分配(负载均衡机制,默认轮询,也可以自定义)给不同的Queue,假如我们有一个消费者组ComsumerGroup,这个消费组中的每一台机器都会负责一部分Queue,那么就会导致顺序的乱序问题
2. 例子
Producer先后发送了2条消息,一条insert,一条update,分别分配到2台Queue中,消费者组中的两台机器分别处理这两个Queue中的消息,这时候顺序是无法保证的
3. 如何解决
1. 保证Producer、Queue、Comsumer是一对一对一的关系
1. 缺点
1. 吞吐量降低
消息队列的吞吐量降低(绝对不容忍这样的情况发生)
2. 有阻塞的风险
如果Comsumer服务炸了,后面的消息就无法消费,被阻塞了
2. 把需要保持顺序消费的消息放到同一个Queue中,且让同一台机子处理
自定义负载均衡模式,把这一批顺序消息有共同的唯一ID,把唯一ID与队列的数量进行hash取余运算,保证这批消息进入到同一个队列
1. 存在的问题
还要考虑Comsumer消费失败的重试问题
3. 使用有序消费的模式
如果失败了会返回这个状态
ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT:稍后消费