Sunday面试指南

Kafka 消费者组如何分配分区?Rebalance 为什么会频繁发生?

下面是一段教学用的模拟面试。

🧑‍💻 面试官:Topic 有三个分区,同一消费者组里放五个消费者,就能五个一起消费吗?

🙋‍♂️ 我:不能,正常分配下,同一分区在组内交给一个消费者,部分成员会空闲。

🧑‍💻 面试官:那扩容时为什么会再均衡?处理一批数据用了很久,但心跳还正常,会不会被移出组?

🙋‍♂️ 我:还要看 poll 的间隔限制,不能只看心跳。

🧑‍💻 面试官:Rebalance 都是让全组停下来吗?新 Consumer 协议和经典协议的分配方式一样吗?

先追踪「分区由谁负责」,再追踪这份责任为什么要交接。活着、有进展、完成交接,是三件事。

面试速答(60 秒版)

在常见的消费者组订阅模式下,Kafka 把分区分配给组内成员,同一分区正常由一个成员负责。消费者可以负责多个分区,成员超过可分配分区数量时,部分成员可能空闲。

成员加入、离开、失去会话,订阅或分区变化等情况,可能触发再均衡,重新安排分区所有权。频繁发生时,要结合组日志检查发布抖动、心跳与会话、处理耗时和 max.poll.interval.ms,而不是只调大一个超时。

还需要区分协议与分配策略。经典协议下有不同的再均衡方式;新 Consumer 协议采用服务端分配与增量交接,不能把所有再均衡都描述成全组停顿。交接时,还应妥善处理未完成任务与消费位点,防止重复副作用。

Kafka 消费组中三个分区与消费者责任

知识点详解:三个分区,扩容时怎样换负责人?

消费者组,分配的是分区责任

假设一个 Topic 有 P0、P1、P2 三个分区,消费者组 G 里有 A、B 两个成员。

一种可能的分配是 A 负责 P0、P1,B 负责 P2。不同策略可能给出不同结果,但它们都需要维护组内相应的分区所有权。

现在加入 C,系统可能把 A 的 P1 交给 C,让负载更均衡。这个过程不是简单把新成员接到原来的分区旁边,让两个人在同一份组责任下随意一起读。

也不要把“组内一个负责人”理解成整个 Kafka 只有一个消费者能读这个分区。不同消费者组可以分别消费同一 Topic,消费进度也各自管理。

再均衡,要解决哪一段交接?

分区从 A 交给 C 时,要确定 A 不再按旧责任继续处理,C 取得新责任,并从合适的消费进度开始。

这里涉及成员状态、分配方案、分区撤销与接收。重分配不是自动把 A 内存里所有业务任务和缓存,原样搬到 C。

如果 A 已经把一批消息交给异步线程,却没有控制交接后这些线程是否继续写数据,旧任务可能仍在执行。再加上未提交位点造成重读,就可能产生重复副作用。

因此,消费者要有明确的撤销处理、任务终止或结果隔离方式,并按实际处理情况管理位点。业务写入也要按需要提供幂等,不把一次再均衡当成天然“只执行一次”。

心跳正常,为什么仍可能有问题?

心跳与会话超时主要帮助判断成员是否还保持组成员资格。max.poll.interval.ms 则限制使用组管理时,应用两次 poll 之间的最长间隔。

假设应用取了一批消息,在同一处理路径上做很慢的外部调用,长时间没有再 poll。即使某些心跳仍在运行,也不能据此保证应用符合 poll 进展约束。

超过限制后的具体移除与重新分配时机,还受静态成员等条件影响。不能写成“超时一到,所有分区立即交给别人”。Kafka 4.1 消费者配置分别说明了这些参数。

所以,先测一批处理多长时间、是否存在长尾,再判断减少批量、拆分任务、调整处理模式或合理增加预算。只把超时无限调大,可能让真正失去进展的成员更晚被发现。

会话超时与 max.poll.interval.ms 两条时间线

Classic 和 Consumer 协议,不能混着讲

经典协议中,分配方案与客户端组协作有关。不同分配策略还决定是否采用立即撤销等方式;经典协议也有 cooperative 的增量协作方案,不是永远只有全组一次性停顿。

Kafka 4.0 起正式可用的新 Consumer 再均衡协议,把分区分配移到服务端,并采用增量设计,减少全局同步带来的阻塞。官方协议说明解释了这项改变。

本题以 Kafka 4.1 文档为基线。group.protocol 可以区分 classic 与 consumer;不能因为 broker 支持新协议,就认定所有客户端已经使用它。

新协议下,心跳间隔与会话超时由相应 broker 配置控制,不能继续照搬经典客户端参数的全部含义。客户端库是否支持、实际选用什么协议,也需要单独核对。

不过,增量交接仍然是交接。涉及变更的分区可能暂时受影响,应用的任务与位点责任也不会因此消失。

消费组协议差异与增量交接的范围

频繁再均衡,怎样按原因查?

先把组状态变化的时间和应用日志对应起来。

如果每次滚动发布都发生,检查成员上下线节奏、是否频繁崩溃重启;如果长任务之后发生,检查 poll 间隔与处理长尾;如果会话不断失效,再看网络、暂停和心跳相关证据。

静态成员与 cooperative 策略等方式,可能减少某些不必要交接,但配置前要理解条件。例如静态身份必须避免同时被多份实例误用,不能当作“所有再均衡都禁止”的开关。

再均衡次数、持续时间、受影响分区、消费延迟与重复处理,都值得观察。只看次数少了,不知道故障成员是否更难被发现,也不能说明改进成功。

分区撤销后旧异步任务仍可能继续

扩容什么时候没有帮助?

同一组里已经有足够成员负责全部分区,再增加成员不一定增加分区级并行。某个分区里的热点,也不能通过随便增加一个消费者就拆成两份责任。

应该继续看分区数量、键分布、每批处理方式和下游瓶颈。是否调整分区,又会牵涉顺序与数据路由,不是一个没有影响的伸缩按钮。

验证时,可在测试集群依次加入成员、停止成员和制造处理长尾,记录分配变化与业务结果。本文没有把教学分配示意当成已完成的集群实验。

面试官继续追问

手动 assign 也会自动按组再均衡吗?

手动分配不使用同样的自动组分配过程,分区责任需要应用自己管理。不能把 subscribe 的规则原样套过去。

再均衡结束了,就不会重复消费吗?

不保证。位点提交、未完成业务与故障窗口都会影响重读和副作用,仍需要按实际交付语义设计。

换新协议就完全不需要优化慢任务吗?

不是。协议改善交接方式,不会让慢外部调用或失去进展的业务自动变快。处理预算和下游能力仍然需要治理。

面试速记卡

  • 分配:组内维护分区负责人,消费者数量不等于无限并行。
  • 触发:成员、会话、订阅与分区变化可能引起责任交接。
  • 进展:心跳与 poll 间隔不是同一个检查。
  • 协议:Classic 的策略与新 Consumer 协议分开确认,不统一写成全组停顿。
  • 工程:撤销后旧任务、消费位点与业务幂等要共同处理。

公司面试真题

真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。

  • 美团 · Java后端 · 实习

    Kafka 消费者与 partition 有什么关系?(题意整理)

    4.21美团Java实习一二面面经 ↗
    面试记录为 2020-04-21、2020-04-24;原帖编辑于 2020-11-14

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历