如何保证消息不丢失,只被消息一次

86 阅读2分钟

如何保证消息只被消息一次?

直接上干货!!!!

要保证消息被消费,第一要点就是要保证消息不丢失,如何保证消息不丢失呢?

1. 如何保证消息不丢失

要保证消息不丢失,我们先来看一张图:

image.png

生产者 ====》 消息队列=====》 消费者 消息可能会在哪几个地方丢失呢?

  1. 生产者发送消息到队列的过程中
    要保证消息在该过程不丢失,消息发送到队列后,会返回ack确认机制。

  2. 消息队列宕机了,消息未被持久化
    消息发送到消息队列后,如果消息还没有被持久化就出现宕机,那么消息也有可能被丢失。
    1) 异步持久化
    消息发送到队列后,被同步到缓存中,就会返回ack给生产者;
    2) 同步持久化
    消息发送到队列后,被同步到缓存中,也会被同步到磁盘后,就会返回ack给生产者;

  3. 消息队列到消费者的过程中 消息被消费者拉取后,我们可以根据业务做相关的处理,来保证消息不丢失。
    1)重试机制:控制消费的次数,将出现异常的数据,存入数据库,后期人工做处理;
    2)重新放入消息队列,控制消费的次数,不然就会出现死循环。

这里的消息,如何保证只被消费一次呢????

2. 如何保证只被消费一次

下面这张图将解答如何对消费者的消息做处理。

image.png

可以将拿到的消息保存到数据库,根据流程图做相关的判断,来保证消息只被处理一次。

这里如果使用数据库,可能会损失一部分的性能。可以换用redis缓存等。。。。