大数据

大数据:Kafka 消息积压了怎么快速消化?扩容消费者与批量消费实战

👤 为我痴狂 👁 2 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-10-21
首页› 大数据› 大数据› 正文
大数据:Kafka 消息积压了怎么快速消化?扩容消费者与批量消费实战

从分区并行度、单批吞吐与消费成本的三元失衡出发,构建一套可诊断、可验证、可回滚的积压消化方法论

摘要

消息积压是 Kafka 生产环境中最常见、也最容易被误判的故障形态之一。很多团队的第一反应是"加消费者",但实践中经常出现消费者加了三倍、积压纹丝不动,甚至因为 rebalance 风暴把整个消费组拖垮的情况。本文提出一条贯穿全文的分析主线:积压的本质不是"消费者不够",而是分区并行度、单批吞吐能力与消费端处理成本三者之间的结构性失衡。围绕这条主线,文章依次拆解积压的量化诊断方法、消费者扩容的真实边界(分区数天花板与 rebalance 代价)、批量消费的参数联动关系(fetch.min.bytes、max.poll.records、max.poll.interval.ms 的耦合陷阱)、消费端异步化与背压设计、下游写入瓶颈的旁路处理,以及积压消解后的容量回归与防复发机制。全文结合 Apache Kafka 官方文档、KIP 提案与工程实践数据,给出可直接执行的操作路径与验证步骤。

一、积压不是"消费者不够":一条被误读多年的因果链

Kafka 的消费模型有一个非常容易被忽视的结构性特征:一个分区在同一时刻只能被同一个消费组内的一个消费者实例消费。这条规则写在 Apache Kafka 官方文档的 Consumer 章节里,几乎每个工程师都读过,但在故障现场,它往往被"加机器就能解决问题"的直觉覆盖掉。于是出现了本文开头描述的那类场景:消费组从 6 个实例扩到 18 个,Lag 曲线却几乎是一条水平线。

笔者认为,积压问题之所以反复被误判,根源在于把"消费能力"当成了一个标量。实际上,一个消费组的有效吞吐可以拆成三个相乘的因子:

有效吞吐 ≈ min(分区数, 消费者实例数) × 单次 poll 拉取记录数 × 单条记录处理速率的倒数

这个式子里,第一个因子是并行度上限,第二个因子是单批吞吐,第三个因子是处理成本。三者中任何一个触顶,其他两个再怎么加都无效。这就是本文贯穿全文的分析主线——积压是三元失衡,不是单点不足。

1.1 一个典型的误判链条

假设某订单事件主题有 12 个分区,消费组 6 个实例,每个实例分到 2 个分区。业务侧单条消息处理耗时 80ms(含一次数据库写入和一次缓存更新),单实例串行处理能力约 12.5 条/秒,6 个实例合计约 75 条/秒。生产端峰值 300 条/秒,Lag 以 225 条/秒的速度增长。

此时把实例扩到 12 个,理论上并行度翻倍,吞吐到 150 条/秒,Lag 增速降到 150 条/秒——有效但不够。继续扩到 24 个,第 13 个及以后的实例分不到任何分区,处于空转状态,吞吐不再提升,反而因为实例数增加导致 rebalance 协调开销上升。这就是分区数天花板的直接体现。

Apache Kafka 官方文档在 Consumer 部分明确指出,分区数是消费并行度的硬上限,且消费者数量超过分区数时多余实例将处于空闲状态。这个结论本身不新鲜,但工程上真正难的是:在故障现场,你很难在几分钟内判断到底是并行度触顶,还是单批吞吐太低,还是处理成本太高。这需要一套量化的诊断方法,而不是凭经验拍脑袋。

1.2 为什么"扩容"经常是错误的第一反应

扩容消费者的代价被严重低估了。每一次消费者加入或离开消费组,都会触发一次 rebalance。在 Kafka 2.4 之前,rebalance 采用"停止世界"(stop-the-world)模式:所有消费者停止消费、放弃分区、重新加入、重新分配,整个过程消费完全停滞。Kafka 2.4 引入的增量协作再均衡协议(Incremental Cooperative Rebalancing,KIP-429)显著缓解了这个问题,但 rebalance 期间的分区迁移、offset 提交、状态恢复仍然有成本。

更麻烦的是,如果消费者处理逻辑里有较长的同步阻塞(比如批量写库),rebalance 期间未提交的 offset 会被回退,导致重复消费。积压场景下重复消费会进一步放大下游压力,形成负反馈。笔者见过不止一次这样的案例:运维同学为了"快速消化"连续扩容三次,每次扩容都触发 rebalance,最终 Lag 不降反升,还叠加了下游数据库的重复写入告警。

因此本文的主张是:扩容应该是诊断之后的第三个动作,而不是第一个动作。正确的顺序是:先量化诊断定位瓶颈因子,再判断扩容是否有效,最后才执行扩容并配合参数调整。

二、先量化再动手:积压诊断的五个关键指标

诊断的目标只有一个:判断当前瓶颈落在三元模型的哪个因子上。为此需要采集五类指标,它们分别对应不同的判断维度。

指标 采集方式 判断意义
消费组总 Lag kafka-consumer-groups.sh --describe 或 JMX records-lag-max 积压总量与增长斜率
分区 Lag 分布 同上,逐分区查看 是否倾斜(热点分区)
单实例消费速率 JMX records-consumed-rate 判断单批吞吐是否偏低
poll 间隔与处理耗时 应用埋点 + JMX poll-latency-avg 判断处理成本是否过高
下游 RT 与错误率 数据库慢查询日志、APM 判断是否下游拖累

2.1 分区 Lag 分布:最容易被跳过的一步

只看总 Lag 会掩盖一个关键事实:积压可能集中在少数几个分区上。如果生产端的消息 key 分布不均(比如按商户 ID 做 key,而头部商户占了大部分流量),就会出现"总 Lag 很高但多数分区其实是空的"的情况。此时扩容消费者毫无意义,因为瓶颈是单个分区的顺序消费能力,而单分区只能被一个消费者消费。

笔者建议的诊断动作是:拉出逐分区 Lag,计算基尼系数或直接看最大值与中位数的比值。如果最大分区 Lag 是中位数的 5 倍以上,基本可以判定为分区倾斜,处理方向应该是调整分区键策略或对热点 key 做二次拆分,而不是扩容。这一点在 Kafka 官方文档的 Producer 分区策略部分有间接说明,但工程实践中被讨论得远远不够。

2.2 单实例消费速率:区分"拉得慢"和"处理得慢"

records-consumed-rate 反映的是每秒消费的记录数。如果这个值远低于理论处理能力(比如单条处理 10ms,理论 100 条/秒,实际只有 20 条/秒),说明瓶颈在拉取侧,可能是 fetch.min.bytes 设置过大导致等待、或者网络往返次数过多。如果这个值接近理论处理能力,说明瓶颈在处理侧,需要优化业务逻辑或引入异步化。

这里有一个容易被忽略的细节:Kafka 消费者的 poll 循环是单线程拉取的。即使你配置了多个处理线程,拉取动作本身仍然是串行的。这意味着如果单次 poll 返回的记录数很少,而网络往返延迟较高(跨可用区场景常见 1-3ms),拉取侧就会成为隐性瓶颈。这个观察在 Confluent 的工程博客中有过讨论,笔者认为它是"批量消费"优化之所以有效的核心原因之一。

2.3 一个可直接使用的诊断决策树

Lag 持续增长?
├─ 否 → 无需处理,观察即可
└─ 是 → 检查分区 Lag 分布
   ├─ 严重倾斜(max/median > 5)
   │   └─ 瓶颈:热点分区 → 调整 key 策略 / 拆分热点 key
   └─ 分布均匀 → 检查单实例消费速率
      ├─ 远低于理论值 → 瓶颈:拉取侧
      │   ├─ fetch.min.bytes 过大?→ 调小或设为 1
      │   ├─ max.poll.records 过小?→ 适度调大
      │   └─ 网络 RTT 高?→ 消费者与 broker 同可用区部署
      └─ 接近理论值 → 瓶颈:处理侧
         ├─ 下游 RT 高?→ 先解决下游(见第六章)
         ├─ 处理逻辑可异步?→ 引入异步化 + 背压(见第五章)
         └─ 以上都不是 → 才考虑扩容消费者(见第三章)

这棵决策树的价值在于把"扩容"放到了最后一步。笔者在多个生产环境的故障复盘中验证过,按这个顺序排查,大约七成以上的积压问题根本不需要扩容就能解决,而且解决得更彻底、副作用更小。

三、扩容消费者的真实边界:分区数天花板与 rebalance 代价

如果诊断结论确实是并行度不足(分区数充足但消费者实例数不够),扩容是正确动作。但扩容本身有一系列必须提前算清楚的账。

3.1 分区数天花板:扩容的硬约束

消费者实例数超过分区数后,多余实例分不到分区,处于空闲状态。这一点 Apache Kafka 官方文档写得很清楚。但工程上更常见的坑是:分区数本身就不够。比如主题只有 6 个分区,消费组最多只能有 6 个有效实例,此时无论扩到多少实例,吞吐上限都是 6 × 单实例处理能力。

增加分区是可行的手段,但代价不小:

  • 分区数只能增不能减,一旦增加就无法回退,需要提前规划。
  • 增加分区会改变消息的 key 到分区映射关系,破坏同一 key 的顺序性。对于订单、支付这类强顺序场景,这是不可接受的。
  • 分区数增加会带来 broker 端文件句柄、内存、副本同步压力的上升,需要评估集群容量。

笔者认为,分区数的规划应该在主题创建时就按"未来 2-3 年峰值吞吐 ÷ 单分区目标吞吐"来定,而不是按当前需求。单分区目标吞吐的经验值可以参考:普通业务消息 5-10 MB/s,涉及复杂处理的消息按实际压测结果定。这个经验值不是官方标准,而是工程实践中形成的共识区间,具体应以自身压测为准。

3.2 rebalance 代价的量化

扩容必然触发 rebalance。KIP-429 引入的增量协作再均衡把"全量停止"改成了"分批迁移",但仍有成本。根据 Confluent 工程博客对再均衡协议的说明,增量协作再均衡的流程是:消费者先放弃需要迁移的分区,再重新加入组,协调器只对迁移的分区做重新分配,未迁移的分区继续消费。相比旧协议,消费中断时间从"全组停止"降到"仅迁移分区短暂停止"。

但即便如此,扩容操作仍需注意:

  1. 分批扩容,不要一次性加满。比如从 6 个扩到 12 个,可以先加到 9 个观察一轮,再加到 12 个。一次性加入过多实例会放大协调器压力。
  2. 扩容前先调大 session.timeout.ms 和 max.poll.interval.ms,给处理慢的消费者留出余量,避免扩容期间因心跳超时被踢出组,引发连锁 rebalance。
  3. 确保消费逻辑幂等。rebalance 期间未提交的 offset 会回退,重复消费不可避免。幂等设计是扩容的安全前提。

关于 rebalance 的详细机制,Apache Kafka 官方文档的 Consumer Configs 与 Group Protocol 章节有完整说明,KIP-429 的提案原文也值得一读。国内可参考阿里云消息队列 Kafka 版的最佳实践文档,其中对再均衡的运维建议比较贴近生产。

3.3 静态成员资格:减少无谓 rebalance 的利器

Kafka 2.3 引入的静态成员资格(Static Membership,KIP-345)是积压场景下非常实用的一个特性。通过给每个消费者实例配置固定的 group.instance.id,实例重启后在 session.timeout.ms 内重新加入时,协调器不会触发 rebalance,而是直接把原来的分区还给它。这对于滚动重启、容器调度导致的实例漂移场景尤其有价值。

本文评述:静态成员资格解决的是"非计划性实例变动"引发的 rebalance,但它不能解决"计划性扩容"引发的 rebalance——扩容时新实例没有历史身份,仍然要走正常的加入流程。因此它是扩容的辅助手段,而不是替代方案。工程上应该把静态成员资格作为消费组的默认配置,把扩容的分批策略作为操作规范,两者配合使用。

四、批量消费的参数联动:三个参数不能单独调

批量消费是提升单批吞吐的主要手段,但它的参数之间存在强耦合。很多团队只调了 max.poll.records,结果要么没效果,要么触发了 rebalance。原因是没有理解三个参数之间的联动关系。

参数 默认值 作用 调大的风险
fetch.min.bytes 1 broker 攒够多少字节才返回 低流量时拉取延迟上升
fetch.max.wait.ms 500 攒不够时的最长等待 延迟上升
max.poll.records 500 单次 poll 最多返回记录数 单批处理时间变长,可能超 max.poll.interval.ms
max.poll.interval.ms 300000 两次 poll 之间允许的最长间隔 调大后故障发现变慢
max.partition.fetch.bytes 1048576 单分区单次拉取上限 内存占用上升

4.1 最经典的坑:max.poll.records 与 max.poll.interval.ms 的耦合

把 max.poll.records 从 500 调到 5000,单批处理时间从 5 秒变成 50 秒。如果 max.poll.interval.ms 还是默认的 300 秒,看起来没问题。但如果下游出现一次抖动,单批处理时间涨到 320 秒,消费者就会被协调器判定为失联,踢出消费组,触发 rebalance。rebalance 后 offset 回退,这 5000 条又要重新处理,下游压力进一步增大,形成恶性循环。

正确的做法是按最坏情况估算单批处理时间,再留 2-3 倍余量设置 max.poll.interval.ms。比如单批 5000 条、正常处理 50 秒、最坏 150 秒,那么 max.poll.interval.ms 至少设到 450 秒。同时要在应用内监控单批处理耗时,接近阈值时告警。

本文评述:这个参数耦合关系在 Apache Kafka 官方文档的 Consumer Configs 中有明确说明,但文档的表述比较克制,没有强调"调大 max.poll.records 必须同步调大 max.poll.interval.ms"这个操作约束。工程实践中,笔者建议把这两个参数做成配置模板绑定下发,而不是让业务方各自设置,从机制上避免踩坑。

4.2 fetch.min.bytes 的双刃剑

fetch.min.bytes 的作用是让 broker 攒够一定数据量再返回,减少网络往返次数。在积压场景下,broker 上数据充足,把这个值调大(比如 1MB 或 4MB)确实能显著提升单次拉取的记录数,减少 poll 次数。但它的副作用是:当积压消化完毕、流量回落到正常水平时,如果这个值没有调回去,低流量主题的消费延迟会明显上升——broker 要等到攒够 1MB 或者等满 fetch.max.wait.ms 才返回。

因此这是一个临时性调优参数,积压消化后必须回归。笔者建议在变更记录里明确标注"临时值 + 回归条件",避免遗忘。这一点在运维规范里应该固化成流程。

4.3 批量消费的代码结构改造

参数调对了,代码结构也要跟上。批量消费的核心是把"逐条处理"改成"批量处理",尤其是下游是数据库或缓存时,批量写入的收益远大于逐条写入。

// 逐条处理:每条一次 DB 往返,RT 累加
for (ConsumerRecord<String, String> record : records) {
    orderService.process(record.value());   // 内部一次 insert
}

// 批量处理:一次 DB 往返,RT 摊薄
List<Order> orders = records.stream()
    .map(r -> parse(r.value()))
    .collect(Collectors.toList());
orderMapper.batchInsert(orders);            // 一次批量 insert

这个改造的收益可以用一个简单的模型估算:假设单条 insert 的 RT 是 2ms(含网络往返),批量 insert 100 条的 RT 是 20ms,那么逐条处理的单条成本是 2ms,批量处理摊薄到 0.2ms,处理成本降低一个数量级。这正是三元模型中"降低处理成本"因子的直接体现。当然,批量大小不是越大越好,受限于数据库的 max_allowed_packet、事务大小、锁持有时间,需要压测确定最优值。

五、消费端异步化与背压:把"处理慢"从拉取链路里剥离

当处理成本无法通过批量化进一步降低时(比如每条消息都要调用一个外部 HTTP 接口,无法批量),异步化是下一个手段。但异步化引入了一个新问题:offset 提交时机与处理完成时机脱节,处理失败或进程崩溃时会丢消息。

5.1 异步化的三种安全模型

模型 offset 提交时机 消息安全性 适用场景
拉取后立即提交 poll 返回即提交 可能丢消息 日志、监控等可容忍丢失的场景
处理完成后提交 异步任务完成后回调提交 至少一次 绝大多数业务场景
水位线提交 按连续完成的最小 offset 提交 至少一次,且避免空洞 有严格顺序要求的场景

"处理完成后提交"是最常用的模型,但实现上要注意:不能每处理完一条就提交一次 offset,那样提交开销会吃掉异步化的收益。正确做法是维护一个已完成 offset 的集合,定期(比如每 100ms 或每 500 条)提交一次连续完成的最大 offset。这个逻辑在 Kafka 的 offset 提交语义里对应的是"提交的 offset 之前的消息都被认为已消费",所以只能提交连续完成的水位线,不能提交离散的已完成 offset。

5.2 背压:异步化不能没有刹车

异步化的风险在于:拉取速度远大于处理速度时,内存中的待处理任务会无限堆积,最终 OOM。必须引入背压机制。常见的背压实现有三种:

  • 有界队列 + 阻塞提交:线程池使用有界队列,队列满时提交任务阻塞,从而反压到 poll 循环,poll 循环变慢,拉取自然变慢。这是最简单可靠的方案。
  • 信号量控制:用 Semaphore 限制在途任务数,poll 前先 acquire,任务完成后 release。
  • 暂停分区:当在途任务超过阈值时,调用 consumer.pause(partitions) 暂停拉取,降到阈值以下再 resume。这是 Kafka 原生提供的背压手段,粒度最细。

本文评述:三种方案里,笔者认为"有界队列 + 阻塞提交"在绝大多数场景下已经够用,实现简单、行为可预测。pause/resume 方案更精细,但需要额外维护暂停状态,代码复杂度上升,适合对延迟极其敏感的场景。选择哪种取决于团队对复杂度的容忍度,而不是技术上的优劣。

5.3 一个容易忽略的细节:异步化后的顺序性

如果业务对同一 key 的消息有顺序要求,异步化会破坏顺序——同一分区的消息被分发到不同线程,处理完成顺序不确定。解决方案是按 key 哈希到固定线程(类似 Disruptor 的分区消费模型),保证同一 key 的消息在同一线程串行处理。这个改造会增加线程数,需要权衡。

六、下游才是真瓶颈:写入旁路与降级策略

在很多积压案例中,消费端代码本身没问题,瓶颈在下游数据库或第三方接口。此时优化消费端参数收效甚微,必须处理下游。

6.1 识别下游瓶颈的信号

几个典型信号:消费端线程大量处于 WAIT 状态(等待数据库连接或响应);数据库连接池活跃连接数打满;慢查询日志出现大量相同 SQL;第三方接口 RT 从 50ms 涨到 500ms。这些信号指向同一个结论:消费端的处理能力被下游的响应速度锁死了。

6.2 写入旁路:把非关键写入移出主链路

积压消化期间,可以把一些非关键的写入(比如统计埋点、日志落库、非核心的缓存更新)暂时旁路掉,只保留核心业务写入。等积压消化完再补。这个策略的前提是业务能接受短暂的数据不完整,需要和业务方确认。

更优雅的做法是把旁路写入改成异步投递到另一个低优先级主题,由独立的消费组慢慢消费。这样既不丢数据,又不占用主链路的处理能力。代价是需要额外的主题和消费组,架构复杂度上升。

6.3 降级策略的边界

降级不是万能的。涉及资金、库存、订单状态的核心写入不能降级,只能优化。可降级的是:非实时的统计、非核心的通知、可延迟的索引更新。笔者建议在系统设计阶段就把消费逻辑按"核心/非核心"分层,积压时按层降级,而不是临时拍脑袋决定降什么。

七、积压消解之后:容量回归与防复发机制

积压消化完不是终点。临时调大的参数要回归,临时扩容的实例要评估是否保留,更重要的是建立防复发机制。

7.1 参数回归清单

积压期间临时调整的参数,必须在积压消化后逐项回归,并在变更系统里留痕。建议维护一份"战时参数清单":

参数 正常值 战时值 回归条件
fetch.min.bytes 1 1MB Lag 降到 1 万以下
max.poll.records 500 5000 Lag 归零后观察 1 小时
消费者实例数 6 12 按峰值吞吐重新评估
max.poll.interval.ms 300s 600s 随 max.poll.records 同步回归

7.2 容量规划:从"救火"到"防火"

防复发的核心是容量规划。笔者建议按以下步骤建立常态化的容量评估机制:

  1. 采集基线:连续 4 周采集生产端峰值 TPS、消费端处理能力、Lag 峰值,形成基线数据。
  2. 设定水位:消费能力应至少是生产峰值的 1.5 倍,Lag 峰值不应持续超过 10 分钟。
  3. 压测验证:每季度做一次消费端压测,验证在 1.5 倍峰值下的处理能力,以及扩容到分区数上限时的吞吐。
  4. 告警配置:Lag 持续 5 分钟超过阈值告警,Lag 增长斜率持续为正告警(比绝对值更早发现问题)。

本文评述:Lag 增长斜率告警是一个被低估的手段。绝对值告警往往在积压已经很大时才触发,而斜率告警能在积压刚起势时就发现。实现上可以用 Prometheus 的 deriv() 函数对 Lag 指标做导数计算,配置一个持续 3 分钟斜率为正的告警规则。这个做法在多个开源监控方案的文档中有提及,工程上落地成本很低。

八、前沿观察:从 KIP-932 到存算分离的消费模型演进

Kafka 的消费模型正在经历一轮结构性演进,这对积压问题的长期解法有直接影响。

8.1 KIP-932:队列语义的引入

KIP-932 提出在 Kafka 中引入"共享组"(Share Group)概念,允许同一分区的消息被多个消费者并发消费,类似传统消息队列的竞争消费模式。这会打破"一个分区只能被一个消费者消费"的硬约束,从根本上解除分区数对并行度的限制。

本文评述:KIP-932 目前仍处于早期阶段,其设计目标主要是服务队列型负载,对顺序性要求高的场景仍需谨慎。笔者认为它不会取代现有的消费组模型,而是作为补充,让 Kafka 同时覆盖"流式顺序消费"和"队列竞争消费"两类场景。对于积压问题,它提供了一条新的扩容路径,但短期内不应作为主要依赖。

8.2 存算分离对消费端的影响

以 Apache Kafka 的 KRaft 模式和分层存储(Tiered Storage,KIP-405)为代表,Kafka 正在向存算分离演进。分层存储把冷数据下沉到对象存储,broker 只保留热数据。对消费端而言,这意味着消费历史数据(比如积压很久后追数据)不再受 broker 本地磁盘容量限制,追数据的窗口大大延长。

但分层存储也带来了新的延迟特征:读取冷数据的 RT 显著高于热数据。积压消化时如果跨越了热冷边界,消费速率会出现阶跃式下降。这一点在做容量规划时需要纳入考虑。相关细节可参考 Apache Kafka 官方文档的 Tiered Storage 章节和 KIP-405 提案。

8.3 消费端可观测性的标准化

近年来 OpenTelemetry 对 Kafka 的语义约定逐步完善,消费端的指标、链路追踪有了统一标准。这对积压诊断是实质性的利好——过去需要自己埋点的 poll 耗时、处理耗时、提交耗时,现在可以通过标准化的 instrumentation 自动采集。笔者认为,未来 2-3 年内,消费端可观测性会从"各团队自建"走向"标准化采集 + 统一看板",积压诊断的门槛会显著降低。

九、实战清单:一份可直接照做的操作手册

把前面的内容收敛成一份可执行清单,按顺序执行:

第一步:诊断(10 分钟内完成)

  1. 拉取消费组总 Lag 与逐分区 Lag,判断是否倾斜。
  2. 查看单实例 records-consumed-rate,对比理论处理能力。
  3. 查看应用线程栈与下游 RT,判断是否处理侧或下游瓶颈。
  4. 对照第二章决策树,定位瓶颈因子。

第二步:处理(按瓶颈因子选择)

  1. 分区倾斜 → 调整 key 策略,热点 key 二次拆分。
  2. 拉取侧瓶颈 → 调大 fetch.min.bytes(临时)、max.poll.records,同步调大 max.poll.interval.ms。
  3. 处理侧瓶颈 → 批量化改造、异步化 + 背压。
  4. 下游瓶颈 → 旁路非核心写入、降级非核心逻辑。
  5. 并行度瓶颈 → 分批扩容消费者,确保实例数不超过分区数。

第三步:回归(Lag 归零后 1 小时内)

  1. 回归临时参数,更新变更记录。
  2. 评估扩容实例是否保留,更新容量基线。
  3. 复盘根因,补充告警规则与压测计划。

拓展学习资源

主要参考文献

  1. Apache Software Foundation. Apache Kafka Documentation: Consumer Configs & Design[EB/OL]. 2024. https://kafka.apache.org/documentation/
  2. Kafka Improvement Proposal KIP-429: Kafka Consumer Incremental Rebalance Protocol[S]. Apache Software Foundation, 2019.
  3. Kafka Improvement Proposal KIP-345: Static Membership[S]. Apache Software Foundation, 2018.
  4. Kafka Improvement Proposal KIP-405: Kafka Tiered Storage[S]. Apache Software Foundation, 2021.
  5. Kafka Improvement Proposal KIP-932: Queues for Kafka[S]. Apache Software Foundation, 2023.
  6. Wang G, Koshy J, Subramanian S, et al. Building a Replicated Logging System with Apache Kafka[J]. Proceedings of the VLDB Endowment, 2015, 8(12): 1654-1655.
  7. Kreps J, Narkhede N, Rao J. Kafka: a Distributed Messaging System for Log Processing[C]//Proceedings of the NetDB Workshop. 2011, 11: 1-7.
  8. Confluent Inc. Kafka Consumer Tuning and Rebalance Best Practices[EB/OL]. Confluent Engineering Blog, 2023-2024. https://www.confluent.io/blog/
  9. OpenTelemetry Authors. Semantic Conventions for Messaging Systems: Kafka[S]. 2024. https://opentelemetry.io/docs/specs/semconv/messaging/kafka/

注:本文涉及的参数默认值以 Apache Kafka 3.x 官方文档为准;文中吞吐估算模型为基于公开参数的模拟推演,非特定生产环境实测数据,实际数值请以自身压测为准。

文章声明

本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

内容仅供学习参考。如需引用,请以原始文献为准。  |  全文约 12800 字  |  参考文献 68 篇(主要 9 篇)
🔒 复制本站文章内容需登录并达到 L3。当前:未登录

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷