-
发送消息的时候将消息的 deliveryMode 设置为 2 。
-
开启生产者 confirm 模式,可以重试发送消息。
(3)消费者丢失消息
==============
消费者丢失消息
消费者刚拿到数据,还没开始处理消息,结果进程因为异常退出了,消费者没有机会再次拿到消息。
解决方案
-
关闭 RabbitMQ 的自动 ack,每次生产者将消息写入消息队列后,就自动回传一个 ack给生产者。
-
消费者处理完消息再主动 ack,告诉消息队列我处理完了。
问题: 那这种主动 ack 有什么漏洞了?如果 主动 ack 的时候挂了,怎么办?
则可能会被再次消费,这个时候就需要幂等处理了。
问题: 如果这条消息一直被重复消费怎么办?
则需要有加上重试次数的监测,如果超过一定次数则将消息丢失,记录到异常表或发送异常通知给值班人员。
(4)RabbitMQ 消息丢失总结
======================
RabbitMQ 丢失消息的处理方案
(5)Kafka 消息丢失
=================
**场景:**Kafka 的某个 broker(节点)宕机了,重新选举 leader (写入的节点)。如果 leader 挂了,follower 还有些数据未同步完,则 follower 成为 leader 后,消息队列会丢失一部分数据。
解决方案
-
给 topic 设置 replication.factor 参数,值必须大于 1,要求每个 partition 必须有至少 2 个副本。
-
给 kafka 服务端设置 min.insyc.replicas 必须大于 1,表示一个 leader 至少一个 follower 还跟自己保持联系。
3. 消息队列的坑之消息乱序
===================
坑: 用户先下单成功,然后取消订单,如果顺序颠倒,则最后数据库里面会有一条下单成功的订单。
RabbitMQ 场景:
-
生产者向消息队列按照顺序发送了 2 条消息,消息1:增加数据 A,消息2:删除数据 A。
-
期望结果:数据 A 被删除。
-
但是如果有两个消费者,消费顺序是:消息2、消息 1。则最后结果是增加了数据 A。
RabbitMQ消息乱序场景
RabbitMQ 消息乱序场景
RabbitMQ 解决方案:
-
将 Queue 进行拆分,创建多个内存 Queue,消息 1 和 消息 2 进入同一个 Queue。
-
创建多个消费者,每一个消费者对应一个 Queue。
RabbitMQ 解决方案
Kafka 场景:
-
创建了 topic,有 3 个 partition。
-
创建一条订单记录,订单 id 作为 key,订单相关的消息都丢到同一个 partition 中,同一个生产者创建的消息,顺序是正确的。
-
为了快速消费消息,会创建多个消费者去处理消息,而为了提高效率,每个消费者可能会创建多个线程来并行的去拿消息及处理消息,处理消息的顺序可能就乱序了。
Kafka 消息丢失场景
Kafka 解决方案:<