RocketMQ重复消费的症状以及解决方案

RocketMQ重复消费的症状以及解决方案

生产消息时重复

症状

当一条消息已被成功发送到 消费者 并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败。 如果此时 生产者 意识到消息发送失败并尝试再次发送消息,消费者 后续会收到两条内容相同并且 ID 也相同的消息。
在这里插入图片描述

方案

  • 避免消息重复产生,找到原因,并做代码的限制。
  • 消费数据时利用Java代码做ID的重复校验,重复则放弃,并返回异常信息。也可以考虑针对数据库有条件的插入语句,限制重复插入。
  • 消费数据时,通过订阅的记录和消费的结果来判断,此消息是否重复订阅过,如果重复订阅,则不在数据库中插入数据。

消费消息时重复

症状

消息已投递到 消费者 并完成业务处理,当 消费者MQ 反馈应答的时候网络闪断。 为了保证消息至少被消费一次,消息队列 MQ 的服务端将在网络恢复后再次尝试投递之前已被处理过的消息,消费者 后续会收到两条内容相同并且 ID 也相同的消息。
在这里插入图片描述

方案

  • 消费数据时利用Java代码做ID的重复校验,重复则放弃,并返回异常信息。也可以考虑针对数据库有条件的插入语句,限制重复插入。

消费时出现异常

症状

消息已投递到 消费者 并完成 业务A 处理,但是 业务B 处理时,发生异常,造成该条消息会标记 消费失败 ,那么为了保证消息至少被消费一次,该条消息会消费多次,直到达到消费16次,会自动放入死信队列。
在这里插入图片描述

方案

  • 分布式事务锁(一般是zookeeper和redis搭建)

猜你喜欢

转载自blog.csdn.net/m0_37996629/article/details/129446453
今日推荐