你们项目为什么用 Kafka?一条核心业务消息从发送到消费成功,如何保证端到端可靠?
我的判断
Kafka 端到端可靠要把生产确认、Broker 副本、消费位点和业务落库连起来;任何一段只配置“可靠”都不够。
生产订单事件时会开启幂等生产者,acks=all,失败有限重试;Broker 要有合适副本数、min.insync.replicas,核心 Topic 禁止不干净选主。这样已确认消息至少进入足够的 ISR,但应用还要保留发送失败证据。
真正棘手的是数据库事务和发消息之间的空隙。我们会用本地 outbox:订单与待发送事件在同一数据库事务提交,后台可靠投递 Kafka,发送成功后标记;或者通过 CDC 订阅变更。
消费者关闭自动提交,只有业务处理成功才提交 offset。数据库写入和位点提交无法天然原子,所以消费端按 eventId 或业务唯一键幂等;失败进入重试/死信,但死信也必须告警和可回放。
监控不只看 Kafka 可用性,还看 outbox 积压、生产错误、ISR、消费 lag、重试与死信、业务事件数量对账。可靠性最终要用故障演练证明。
思路拆解问题分析
“不丢消息”至少有三个边界:业务事务到生产者、Broker 内部、消费者到业务结果。每个边界的确认时点和重试语义都不同,必须逐段闭环。