如何保证消息不被重复消费

(以kafka为例)

生产者

在 Kafka0.11 版本和 Pulsar 中都支持“producer idempotency”的特性翻译过来就是生产过程的幂等性,这种特性保证消息虽然可能在生产端产生重复但是最终在消息队列存储时只会存储一份

它的做法时给每一个生产者一个唯一的 ID,并且为生产的每一条消息赋予一个唯一 ID,消息队列的服务端会存储 < 生产者 ID,最后一条消息 ID> 的映射。当某一个生产者产生新的消息时,消息队列服务端会比对消息 ID 是否与存储的最后一条 ID 一致,如果一致,就认为是重复的消息,服务端会自动丢弃

消费者

offset

kafka有个offset的概念,就是每个消息写进去,都有一个offset,代表他的序号,然后consumer消费了数据之后,每隔一段时间,会把自己消费过的消息的offset提交一下,代表已经消费过了,下次重启就继续从上次消费到的offset来继续消费

但是有时候重启系统,或者直接kill进程了,再重启。这会导致consumer有些消息处理了,但是没来得及提交offset,重启后少量消息会再次被消费,怎么保证幂等性呢

1)数据库幂等,像insert,先根据主键查一下,也可以基于数据库的唯一键

2)利用redis做幂等,让生产者发送每条数据的时候,里面加一个全局唯一的id,消费时先根据这个id去比如redis里查一下,如果有了就丢弃,没有就处理,然后写入redis

posted @ 2023-06-12 16:23  上好佳28  阅读(91)  评论(0)    收藏  举报