kafka怎么处理消息一致性
在 Kafka 里“消息一致性”一般分三层看生产一致性、存储一致性、消费一致性。Kafka 自身默认是“至少一次”需要配合 幂等生产者 事务 幂等消费者/业务设计 才能做到“业务上看起来恰好一次”。一、生产端怎么保证“消息一定写进 Kafka而且不乱序/不重复太多”幂等生产者idempotent producer开启enable.idempotencetrue原理Producer 给每个消息带上 (producerId, sequenceNumber)Broker 只接受没见过的序号自动去重。效果在 重试场景下避免重复消息并保证同一分区内消息单调有序。可靠写入配置acksall要求所有 ISR 副本确认才算成功retries 0失败自动重试max.in.flight.requests.per.connection 通常配合设为 15避免乱序 面试可说“我们生产端开启了幂等和 acksall保证消息写 Kafka 时不会因为重试产生重复或丢失。”二、存储端Kafka 自己的一致性保证副本机制一个 Leader多副本 Follower同步复制只有写入 ISRin-sync replicas 成功的才对消费者可见Broker 崩了可以从 ISR 副本中选新 Leader避免已确认的消息丢失这块你简单一句就行“依赖 Kafka 的副本 ISR 机制保证已确认消息不丢。”三、消费端offset 与业务数据的一致性难点Kafka 默认只保证消息至少被消费一次因为 offset 提交的时机不对会导致先提交 offset 后处理失败 → 消息丢失先处理成功但没来得及提交 offset 就挂了 → 消息重复消费常见做法1“处理后再提交 offset” 幂等业务逻辑最常用流程拉消息处理写 DB 等成功后提交 offset处理失败就不提交下次重试 → 至少一次业务端通过 幂等键如业务 ID、去重表、唯一约束来防止副作用重复 例支付结果消费时根据 orderId 做幂等表/唯一索引即使重复消息也不会重复更新。2Kafka 事务将“写消息 提交 offset”绑在一起高级一点开启事务Producer 配置 transactional.id调用 initTransactions()在事务里send() 生产消息sendOffsetsToTransaction() 把消费的 offset 一起提交最后 commitTransaction() 或 abortTransaction()这样可以实现端到端的 EOSExactly Once Semantics要么消息 offset 一起提交要么都不提交下次重新消费但对下游是幂等的 面试说法 “我们用 Kafka 事务把消费 offset 提交和新消息发送放在一个事务里再加下游幂等保证业务上恰好一次。”四、端到端“业务一致性”的常见设计套路Outbox本地消息表模式数据库 → Kafka本地事务同时写业务表 outbox 表后台任务从 outbox 表拉消息发 Kafka保证“业务成功就一定发消息”下游幂等表 / 唯一约束Kafka → 数据库消费时以业务主键如 orderId、eventId做唯一索引/幂等表插入已存在则当作重复消息丢弃重试 死信队列消费失败重试几次仍失败的放 Dead Letter Queue避免一直卡在主队列
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2430132.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!