场景:
1台rabbitmq服务器,多台java rabbitmq 客户端,取消息使用确认机制,即从mq取了消息要调用channel.basicAck以确保mq将该消息删除。
连接工厂采用autoRecovery策略
正常情况:,在连接没有关闭的情况下,每个客户端取消息,完成业务处理后调用channel.basicAck来确认消息已经处理。
异常情况:在连接关闭时(可能mq服务挂了,或者网络连接不上),例如某个客户端取了10个消息,且这10个消息还在处理中,并未调用channel.basicAck。由于连接关闭,这10个消息会被rabbitmq重新放到队列中,这样就会导致重复处理消息, 有什么机制可以避免这种情况发生么?
从mq本身机制来说,它无法在连接关闭的状态下确认任务的执行状态,但是可以从另外两个方面避免这样的问题:
1 从业务逻辑上避免任务重复执行。消息可能重复发送,但是在执行任务之前先检查一下。
2 采用mq集群等方式,提高mq的可用度,和稳定性。