rabbitmq 连接关闭并恢复后, 客户端如何避免处理重复消息

疯狂的骑士 发布于 2015/09/12 09:56
阅读 3K+
收藏 0

场景:

1台rabbitmq服务器,多台java rabbitmq 客户端,取消息使用确认机制,即从mq取了消息要调用channel.basicAck以确保mq将该消息删除。

连接工厂采用autoRecovery策略

正常情况:,在连接没有关闭的情况下,每个客户端取消息,完成业务处理后调用channel.basicAck来确认消息已经处理。

异常情况:在连接关闭时(可能mq服务挂了,或者网络连接不上),例如某个客户端取了10个消息,且这10个消息还在处理中,并未调用channel.basicAck。由于连接关闭,这10个消息会被rabbitmq重新放到队列中,这样就会导致重复处理消息, 有什么机制可以避免这种情况发生么?

加载中
0
huan
huan

从mq本身机制来说,它无法在连接关闭的状态下确认任务的执行状态,但是可以从另外两个方面避免这样的问题:

1 从业务逻辑上避免任务重复执行。消息可能重复发送,但是在执行任务之前先检查一下。

2 采用mq集群等方式,提高mq的可用度,和稳定性

疯狂的骑士
疯狂的骑士
en 目前只能在业务上进行防重复处理了,比如在客户端存储接收到的消息,消息处理完再删除,而从mq中取到消息就立即确认
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部