在使用mq消息队列的时候,如何保证消息队列的消息不丢失?

提问者:帅平 问题分类:消息队列
在使用mq消息队列的时候,如何保证消息队列的消息不丢失?
1 个回答
Rae
Rae 管理员
先说这个问题的思路:
你要知道一条消息从发送到消费的每个阶段,是否存在丢消息,以及如何监控消息是否丢失,最后才是如何解决问题,方案可以基于“ MQ 的可靠消息投递 ”的方式。

所以这个问题的答案可以参考:
1、消息生产阶段: 从消息被生产出来,然后提交给 MQ 的过程中,只要能正常收到 MQ Broker 的 ack 确认响应,就表示发送成功,所以只要处理好返回值和异常,这个阶段是不会出现消息丢失的。
2、消息存储阶段: 这个阶段一般会直接交给 MQ 消息中间件来保证,但是你要了解它的原理,比如 Broker 会做副本,保证一条消息至少同步两个节点再返回 ack。
3、消息消费阶段: 消费端从 Broker 上拉取消息,只要消费端在收到消息后,不立即发送消费确认给 Broker,而是等到执行完业务逻辑后,再发送消费确认,也能保证消息的不丢失。

然后我们附一张图看看:

这张图很直观的表达了消息队列的三个阶段,我们一定要联想到这3个阶段。
发布于:2年前 (2022-10-18) IP属地:四川省
Rae
Rae管理员
除了上面的内容,其实我们还可以思考下,我们如何知道消息是否有丢失了,我们常见的做法主要有以下:
在发送消息之前为每一个消息定义一个全局唯一的id,同时对应一个status状态为未处理,保存到数据库中。消费者消费完成的时候,把对应的这个全局id的status状态修改为已处理。这样子我们可以在事后筛选出到底有没有数据丢失,然后做一下事务补偿机制。
发布于:2年前 (2022-10-18) IP属地:四川省
我来回答