开发者社区> 问答> 正文

RocketMQ消息重复消费(同一条消息2毫秒内分别在两台机器上被消费)

生产者:
2018-09-03 10:31:10.307 8182147902 [pool-2-thread-4] [INFO ] c.c.g.*.utils.RocketProducerUtil - RocketMq返回状态:SEND_OK,MQMsgId:0A3ABDAC00002A9E0000001D77B3EDE1,msgId:b338350ca72344428eae18c5040f412a

消费者:经查日志显示:
IP --> ..174.16,消费时间:2018-09-03 10:31:10.307 5102948121
IP --> ..174.15,消费时间:2018-09-03 10:31:10.308 5702882940

两个消费者,分别是不同的IP,在相差1毫秒的情况下分别消费一次,共消费2次。即使消费端做幂等处理,对于分布式系统来说,做数据同步也可能会存在延迟会,可能会导致幂等失效。

请问:两台服务器上的消费者,在相差1毫秒的情况下,分别消费两次,这样的现象正常吗?

展开
收起
幸福鳥 2018-09-03 17:41:22 24330 0
5 条回答
写回答
取消 提交回答
  • 我问题已解决,就是楼上说的instanceName 的原因,可以把mq客户端rocketmq-spring-boot-starter升级到最新版本,我目前最新版是2.2.1,见org.apache.rocketmq.spring.support.RocketMQUtil.getInstanceName()的方法,在254行处,如下,就解决了重复消费问题

    public static String getInstanceName(String identify) { char separator = '@'; StringBuilder instanceName = new StringBuilder(); instanceName.append(identify).append(separator).append(UtilAll.getPid()).append(separator).append(System.nanoTime()); return instanceName.toString(); }

    2021-09-10 13:37:34
    赞同 展开评论 打赏
  • 有可能,如果出现网络波动,重新负载均衡,会出现多台机器在某个时间窗口拿到同一个队列。

    2020-03-12 19:41:05
    赞同 1 展开评论 打赏
  • 我也遇到了同样的问题,折腾了好久。我的问题是因为给所有消费者(consumer)设置了相同的instanceName导致消息被ConsumerGroup中的每个Consumer都消费一次。 解决方案:去除consumer的instanceName设置。 //consumer.setInstanceName(); 本地环境测试后可以正常消费消息了。

    但使用Docker部署项目后,发现又再次出现重复消费问题。经过一番查询后,发现不设置instanceName时,rocketmq会使用ip@pid作为instanceName(pid代表jvm名字)。又再次导致instanceName相同。 解决方案:设置consumer的instanceName,给一个UUID使instanceName不相同,解决。 consumer.setInstanceName(UUID);

    2019-10-21 04:37:32
    赞同 展开评论 打赏
  • 我也遇到这个问题,不知道楼主有没有找出原因,我这边现象是同一个进程内部不同处理线程同时收到同一条消息,rocketmq日志会有如下这条日志:Note: accumulation consume occurs on mq:*,系统以前很少出现,但是昨天复位业务进程之后频繁出现,目前还没有分析出来为什么有这个问题

    2019-07-17 23:03:25
    赞同 展开评论 打赏
  • 自由散漫的开发者,哇哈哈

    RocketMQ不解决消息重复推送问题。解决的话一是在客户端做幂等性处理,二是消息有唯一编号,消费完的消息,存到消息表里,这样做去重。第二种对消息系统的吞吐量有巨大的需求,能用客户端去解决的话,最好用客户端的幂等性

    2019-07-17 23:03:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RocketMQ Client-GO 介绍 立即下载
RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载