前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Kafka producer acks 0 1 all 可靠性
分布分布式系统消息与异步处理

Kafka 生产者 acks=0、acks=1 和 acks=all 分别牺牲什么可靠性?

Kafka生产者acks=0不确认发送,消息易丢失;acks=1等待leader确认,leader宕机可能丢数据;acks=all等待全部ISR确认,最可靠但延迟高。

前端进阶之旅 · 一题精讲更新于 2026.09.05
分布式系统#消息与异步处理#异步编程#性能优化
先看核心答案
理解线索

acks与确认粒度

  1. acks=0不等待任何确认,立即返回
  2. acks=1仅等待leader写入,不等follower同步
  3. acks=all等ISR所有副本确认,通常配合min.insync

实际可靠性还受min.insync.replicas和副本同步状态影响

核心回答

先记住这个答案

acks=0牺牲了发送确认,消息可能因网络或Broker故障静默丢失。acks=1仅等待Leader副本写入,若Leader崩溃且未同步副本,消息将丢失。acks=all要求消息被ISR内所有副本确认,通常配合min.insync.replicas保证持久性,但副本不足时写入失败,牺牲可用性。因此,acks=0失去可见性,acks=1不保证副本同步,acks=all在故障时可能失去可用性。

  • acks=0不确认发送,丢失不可感知
  • acks=1仅leader确认,leader宕机可能丢
  • acks=all等ISR全部确认,最可靠但慢

三种确认级别的内部机制

acks=0时,生产者发送消息后不等待broker响应,直接认为成功。如果请求在网络上丢失,或broker在持久化前宕机,消息就丢失,生产者无从感知。该设置下发送吞吐最大,但失败不可见。

acks=1时,broker的leader副本把消息写入本地日志后即返回确认,不等待follower同步。若在返回后leader崩溃,而follower尚未拉取该消息,则消息丢失。leader切换后新leader可能没有这条消息,消费者读不到。acks=all时,leader会等待所有ISR副本确认才返回,因此只要ISR中至少有一个follower存活,消息就不会因leader故障而丢失。

日志采集场景下的acks决策

某系统向Kafka发送非关键运行日志,业务允许少量丢失但希望延迟低。若采用acks=0,在broker繁忙或网络抖动时消息会静默丢失,但延迟最低。若对丢容忍度更低,可设acks=1,此时若leader宕机且没有同步副本,日志仍会丢失,但大多数故障下可避免网络层丢失。

若日志用于安全审计,则必须不丢,所以选用acks=all并设置min.insync.replicas=2,同时副本因子设为3。当集群只剩一个副本可用时,写入会失败,生产者得到异常并重试,从而确保消息持久化到至少2个副本。该场景牺牲了部分延迟,但换取了数据安全。

acks有效性的适用边界

acks=all并不能绝对保证不丢消息,若ISR中的所有副本同时宕机,并且启用了unclean.leader.election,那么非同步副本可能成为leader,之前已确认的消息可能丢失。此外,若min.insync.replicas被设为1,acks=all实际退化为acks=1,因为当只有leader在ISR时也会确认。

生产者的重试机制与acks独立,启用重试可能重复消息,但幂等生产者可避免重复。如果acks=0且启用重试,重试仅当发送失败时发生,但消息可能已到达,造成重复。正确选择acks需结合副本因子、min.insync.replicas及故障恢复策略,而不只关注生产者配置。

回答前,多想一步

容易答错的地方

acks=0消息一定丢失
实际上网络正常时消息能到达,但生产者无法感知发送失败。如果broker在接收前故障,消息丢失。所以它不存在确认机制,但不是必然丢,而是丢失不可见。
acks=all保证不丢
如果min.insync.replicas设为1,则all的效果与1类似;若ISR全部掉线且开启unclean选举,已确认消息仍会丢。all仅保证在写入时有足够副本同步,不能抵抗所有灾难场景。
试着用自己的话回答

面试官还会怎么问?

acks=all时,min.insync.replicas设置过大会有什么影响?

如果min.insync.replicas大于实际副本数,如副本因子为2,设置min.insync=3,所有写入都会失败,因为ISR不可能达到3。即使小于副本数,设置过高也会降低可用性,因为网络分区可能使可用副本数低于该值,导致写入拒绝。

acks=1下,leader返回确认后立即崩溃,消息会丢失吗?

可能。消息已写入leader日志,但follower尚未复制。如果leader崩溃且没有包含该消息的follower被选为新leader,消息就丢失。若选举发生在其他已同步副本上,则不丢,取决于follower同步时机。

如何监控acks=1下的消息丢失情况?

生产者指标record-error-rate可能为0,因为leader已确认。业界常用端到端完整性校验,如消费者侧对比业务字段或发送总数。也可监测broker的under-replicated-partitions和ISR收缩事件,但无法精确量化丢失。

从一道题,走向一组知识

把知识连起来

消息与异步处理

Kafka commitSync 与 commitAsync 的失败处理有什么本质差别?

同属「消息与异步处理」专题,接着看 Kafka commitSync commitAsync offset 提交失败 在具体场景中的处理方式。

消息与异步处理

Kafka 消费者如何实现 at-most-once,并接受什么数据丢失风险?

同属「消息与异步处理」专题,接着看 Kafka at-most-once 先提交位移 消息丢失 在具体场景中的处理方式。

参考资料

  • Learning

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 三种确认级别的内部机制
  3. 日志采集场景下的acks决策
  4. acks有效性的适用边界
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑