如何保证消息不被重复消费
(以kafka为例)
生产者
在 Kafka0.11 版本和 Pulsar 中都支持“producer idempotency”的特性,翻译过来就是生产过程的幂等性,这种特性保证消息虽然可能在生产端产生重复,但是最终在消息队列存储时只会存储一份
它的做法时给每一个生产者一个唯一的 ID,并且为生产的每一条消息赋予一个唯一 ID,消息队列的服务端会存储 < 生产者 ID,最后一条消息 ID> 的映射。当某一个生产者产生新的消息时,消息队列服务端会比对消息 ID 是否与存储的最后一条 ID 一致,如果一致,就认为是重复的消息,服务端会自动丢弃
消费者
offset
但是有时候重启系统,或者直接kill进程了,再重启。这会导致consumer有些消息处理了,但是没来得及提交offset,重启后少量消息会再次被消费,怎么保证幂等性呢
1)数据库幂等,像insert,先根据主键查一下,也可以基于数据库的唯一键
2)利用redis做幂等,让生产者发送每条数据的时候,里面加一个全局唯一的id,消费时先根据这个id去比如redis里查一下,如果有了就丢弃,没有就处理,然后写入redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】