如何保证消息不被重复消费
(以kafka为例)
生产者
在 Kafka0.11 版本和 Pulsar 中都支持“producer idempotency”的特性,翻译过来就是生产过程的幂等性,这种特性保证消息虽然可能在生产端产生重复,但是最终在消息队列存储时只会存储一份
它的做法时给每一个生产者一个唯一的 ID,并且为生产的每一条消息赋予一个唯一 ID,消息队列的服务端会存储 < 生产者 ID,最后一条消息 ID> 的映射。当某一个生产者产生新的消息时,消息队列服务端会比对消息 ID 是否与存储的最后一条 ID 一致,如果一致,就认为是重复的消息,服务端会自动丢弃
消费者
offset
但是有时候重启系统,或者直接kill进程了,再重启。这会导致consumer有些消息处理了,但是没来得及提交offset,重启后少量消息会再次被消费,怎么保证幂等性呢
1)数据库幂等,像insert,先根据主键查一下,也可以基于数据库的唯一键
2)利用redis做幂等,让生产者发送每条数据的时候,里面加一个全局唯一的id,消费时先根据这个id去比如redis里查一下,如果有了就丢弃,没有就处理,然后写入redis

浙公网安备 33010602011771号