RocketMQ重复消息终极解决方案

关于RocketMQ的基本原理与实践,可拜读大神的文章:分布式开放消息系统(RocketMQ)的原理与实践

大神的文章分析了RocketMQ实现顺序消息的原理,由此引出一个新问题:如何解决重复消息问题?

大神给出的回答是:

RocketMQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。

意不意外,惊不惊喜?

赶紧回归正题,业务端如何去重呢?原理很简简单,步骤如下:

1、记录下每个消息的msgID
2、新消息来的时候,查看该消息的msgID是否已记录,是则抛弃,否则消费

那么msgID记录在哪里呢?当然是缓存。所以我在解决这个问题的时候,使用了redis缓存。具体做法如下:

1、消费端接收到消息的时候,调用redis提供的incr方法,以msgID作为key(具有唯一性),value则默认从1开始递增。

2、当incr返回值为1时,设置其失效时间为两分钟以后(每个msgID保留两分钟足矣!),并且该消息需要被消费。

3、当incr返回值大于1时,则忽略该消息。

部分代码如下:



这样就在业务端简单有效地解决了重复消息问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容