我的 RocketMQ 发一个消息,一个客户端会拉三次,消费三次,为啥?
来源:云原生后端社区
不保证 exactly once 语义,即不保证只消费一次,需要业务自己做幂等。RocketMQ 发送方的默认重试次数刚好是 3 次。发送一条消息时,超时时间内,如果失败了,会自动重试。第一次发送,加上 2 次重试,总共是 3 次。3 秒内,如果第一次发送失败,则进行重试,最多重试 2 次。如果 3 秒内成功了,不会抛出异常。所以虽然看起来调用了一次,实际上可能不止一次。每次重试可能是发送到不同的 broker,比较难查,如果是线上业务,一直有数据发送的话,更不容易确定。如果只是自己搭建个 broker,写个 demo 玩的话,可以通过 console,看一下发送一条消息,有几个 partition 的 offset 增加了。正常只会有一个 partition 的 offset 增加 1,这个时候说明,只发送了一次,生产者没有重复发送。以为默认大家都说的使用 consumer group。使用 consumer group 的情况下,消费者判断消息是否重复发送,可以根据 UNIQ_KEY 来判断,如果消息内容相同,UNIQ_KEY 不同,则说明可能是重复发送了。
来源:云原生后端社区
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。