关于mq重复消息

producer重复发送, RocketMQ的broker是不管的, Kafka开启幂等后, 每个消息都会带一个"进程pid+topic+自增序列号"的唯一标识, 重试的消息的唯一标识是相同的.
consumer重复消费, 可以用bitmap来做去重.前提是mq必须有自定义路由, 让同一个消息发到同一个队列, 重复的消息会在同一个队列. 一个consumer可能对应多个队列(或分区),那么就需要用一个map或list来分别保存各个分区的bitmap,因为bitmap是数组下标来判断是否已经消费, 所以消息的唯一id要是数字, 如果是字符+数字, 也得是枚举类型的字符, 这样就只能用map来对枚举字段进行维度划分. 这样搞有个问题, 就是rebalance的时候, 这种方案可能还是会产生重复消费, 解决方案就是监听rebalance, rebalance之后, 就把自己的bitmap广播出去(可以用zk,redis,也可以发一个mq), consumer会取到rebalance之后自己负责的队列的bitmap

你可能感兴趣的:(mq)