rocketmq重复消费问题

RocketMQ 默认提供的是 At-Least-Once(至少一次) 的投递语义。这意味着在正常情况下(网络、Broker、Consumer 都正常工作),它能保证消息肯定会被消费。但为了实现这个“至少一次”的保证,在遇到异常时(如消费失败、网络闪断、客户端重启等),它会触发重试机制,这就可能导致同一条消息被投递多次。
常见原因
1.消息消费失败,当消息被消费失败的时候,消息会被送回到broker,延迟一段时候后broker会重新发送给消费者,如果说消费逻辑不是幂等的,就可能会导致重复消费(幂等,某个操作执行一次和执行多次结果相同)。
2.增加或减少了消费者实例,导致进行rebalanced,这就可能会导致broker会把其他消费者正在消费的消息推给新的 Consumer 实例,导致重复消费。
3.由于网络原因可能导致生产者重复推送消息。
解决方法
生产者发送消息时携带消息唯一标识符(key),消费者消费时保证消息幂等性。
具体实现:
在数据库中设置一个消息去重表,对消息的唯一标识符添加唯一索引,这样新增具有相同唯一标识符的数据就不会新增到数据表中。当每次消费消息的时候,先将消息插入数据库,如果插入成功了去执行消费逻辑;如果插入失败了,说明之前已经插入了,也说明消息之前被消费过了,我们直接返回消费成功即可。
演示代码
生产者
image
消费者
image
完整代码看文件“repeatTest”

posted on 2025-09-05 10:34  jaba  阅读(48)  评论(0)    收藏  举报

导航