Kafka是核心中间件,下面我详解Kafka重复消费@mikechen
一、消息与业务设计
首先,应在消息层面设计唯一标识(如全局唯一 ID 或业务主键),作为去重的基础。

消息元数据中携带足够信息(时间戳、来源、版本等),便于幂等判断与追踪。
对于业务允许的语义,应明确选择“至少一次”(at-least-once)。
或“精确一次”(exactly-once)消费模型,并据此设计处理流程。
二、消费者端幂等与去重
消费者应实现幂等处理,可以通过使用外部持久化去重表。
例如:数据库的唯一约束、或分布式缓存带原子写入,来判断同一消息是否已被处理。

处理流程,通常为先应用幂等检查与写入,然后再提交偏移量(offset),以避免因提交顺序问题导致重复。
若使用事务性存储、或数据库事务,可将消息处理与偏移提交放入同一事务,进一步降低重复的可能性。
三、Kafka 配置与特性利用
Kafka 提供多项特性,帮助降低重复消费风险。

开启消费者自动提交需谨慎,推荐手动提交并在业务处理成功后,再提交偏移量。
利用 Kafka 的事务(Transactional Producer),实现端到端的精确一次语义。
合理设置分区数与消费者并发度,避免因过度并发导致的竞态条件。
同时配置合适的重试策略与死信队列(DLQ),对异常消息进行隔离处理。
四、系统级保障与监控
在高并发场景下,还需从架构和运维层面保障一致性与可观测性。

使用幂等生产者(idempotent producer),减少重复写入。
通过分布式锁、或乐观并发控制,在跨服务场景中协调状态更新。
建立完备的监控与告警体系,跟踪重复消费率、偏移提交延迟与消息积压,及时定位问题并回滚或重放消息。
mikechen睿哥
10年+一线大厂架构实战经验,操盘多个亿级大厂核心项目,就职于阿里、淘宝等一线大厂。