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

提问者:帅平 问题分类:消息队列

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

1 个回答
Rae
Rae 管理员

先说这个问题的思路:

你要知道一条消息从发送到消费的每个阶段,是否存在丢消息,以及如何监控消息是否丢失,最后才是如何解决问题,方案可以基于“ MQ 的可靠消息投递 ”的方式。

所以这个问题的答案可以参考:

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

然后我们附一张图看看:

这张图很直观的表达了消息队列的三个阶段,我们一定要联想到这3个阶段。

发布于:1个月前 (10-18)
Rae
Rae管理员

除了上面的内容,其实我们还可以思考下,我们如何知道消息是否有丢失了,我们常见的做法主要有以下:

在发送消息之前为每一个消息定义一个全局唯一的id,同时对应一个status状态为未处理,保存到数据库中。消费者消费完成的时候,把对应的这个全局id的status状态修改为已处理。这样子我们可以在事后筛选出到底有没有数据丢失,然后做一下事务补偿机制。

发布于:1个月前 (10-18)
我来回答