乐趣区

关于mq:关于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

退出移动版