如何保证消息只被消息一次?
直接上干货!!!!
要保证消息被消费,第一要点就是要保证消息不丢失,如何保证消息不丢失呢?
1. 如何保证消息不丢失
要保证消息不丢失,我们先来看一张图:
生产者 ====》 消息队列=====》 消费者 消息可能会在哪几个地方丢失呢?
-
生产者发送消息到队列的过程中
要保证消息在该过程不丢失,消息发送到队列后,会返回ack确认机制。 -
消息队列宕机了,消息未被持久化
消息发送到消息队列后,如果消息还没有被持久化就出现宕机,那么消息也有可能被丢失。
1) 异步持久化
消息发送到队列后,被同步到缓存中,就会返回ack给生产者;
2) 同步持久化
消息发送到队列后,被同步到缓存中,也会被同步到磁盘后,就会返回ack给生产者; -
消息队列到消费者的过程中 消息被消费者拉取后,我们可以根据业务做相关的处理,来保证消息不丢失。
1)重试机制:控制消费的次数,将出现异常的数据,存入数据库,后期人工做处理;
2)重新放入消息队列,控制消费的次数,不然就会出现死循环。
这里的消息,如何保证只被消费一次呢????
2. 如何保证只被消费一次
下面这张图将解答如何对消费者的消息做处理。
可以将拿到的消息保存到数据库,根据流程图做相关的判断,来保证消息只被处理一次。
这里如果使用数据库,可能会损失一部分的性能。可以换用redis缓存等。。。。