生产者:
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毫秒的情况下,分别消费两次,这样的现象正常吗?
我问题已解决,就是楼上说的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(); }
我也遇到了同样的问题,折腾了好久。我的问题是因为给所有消费者(consumer)设置了相同的instanceName导致消息被ConsumerGroup中的每个Consumer都消费一次。 解决方案:去除consumer的instanceName设置。 //consumer.setInstanceName(); 本地环境测试后可以正常消费消息了。
但使用Docker部署项目后,发现又再次出现重复消费问题。经过一番查询后,发现不设置instanceName时,rocketmq会使用ip@pid作为instanceName(pid代表jvm名字)。又再次导致instanceName相同。 解决方案:设置consumer的instanceName,给一个UUID使instanceName不相同,解决。 consumer.setInstanceName(UUID);
我也遇到这个问题,不知道楼主有没有找出原因,我这边现象是同一个进程内部不同处理线程同时收到同一条消息,rocketmq日志会有如下这条日志:Note: accumulation consume occurs on mq:*,系统以前很少出现,但是昨天复位业务进程之后频繁出现,目前还没有分析出来为什么有这个问题
RocketMQ不解决消息重复推送问题。解决的话一是在客户端做幂等性处理,二是消息有唯一编号,消费完的消息,存到消息表里,这样做去重。第二种对消息系统的吞吐量有巨大的需求,能用客户端去解决的话,最好用客户端的幂等性
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。