Apache Kafka 4.0 正式发布了,这是一次里程碑式的版本更新。这次更新带来的改进优化非常多,不仅简化了 Kafka 的运维,还显著提升了性能,扩展了应用场景。
我这里简单聊聊我觉得最重要的 3 个改动:
- KRaft 模式成为默认模式
- 消费者重平衡协议升级
- 队列功能(早期访问版本)
详细更新介绍可以参考官方文档:https://www.confluent.io/blog/introducing-apache-kafka-4-0/ 。
KRaft 模式成为默认模式
在 Kafka 2.8 之前,Kafka 最被大家诟病的就是其重度依赖于 Zookeeper 做元数据管理和集群的高可用(ZK 模式)。在 Kafka 2.8 之后,引入了基于 Raft 协议的 KRaft 模式(Kafka Raft),不再依赖 Zookeeper,大大简化了 Kafka 的架构,让你可以以一种轻量级的、单进程的方式来使用 Kafka。
KRaft 模式在后续的版本中不断完善,直到 Kafka 3.3.1,被正式标记为生产环境可用(Production Ready)。
Kafka 4.0 则迈出了更大的一步——彻底移除了对 Zookeeper 的支持,并默认采用 KRaft 模式。
需要注意的是,Kafka 4.0 不再支持以 ZK 模式运行或从 ZK 模式迁移。如果你的 Kafka 仍然使用 ZK 模式,官方建议先升级到过渡版本(如 Kafka 3.9),执行 ZK 迁移后再升级到目标版本。
详细介绍:https://developer.confluent.io/learn/kraft/
消费者重平衡协议升级
全新的消费者重平衡协议正式 GA 了,可以告别“stop-the-world”重新平衡了!这个协议的核心思想最早在 Kafka 2.4 版本 通过KIP-429: Kafka Consumer Incremental Rebalance Protocol 实现。
新协议的核心在于增量式重平衡,不再依赖全局同步屏障,而是由组协调器(GroupCoordinator)驱动,各个消费者独立地与协调器交互,只调整自身相关的分区分配,从而将全局的“停顿”分解成多个局部的、微小的调整。只有需要调整的消费者和分区才会发生变更,未受影响的消费者可以继续正常工作(旧有的再均衡协议依赖于组范围内的同步屏障,所有消费者都需要参与,这会导致明显的“停顿”)。
详细介绍:https://cwiki.apache.org/confluence/x/HhD1D
队列功能(早期访问版本)
Kafka 4.0 通过引入共享组 (Share Group) 机制提供了类似队列的功能。不过,它并非真正意义上的队列,而是利用 Kafka 已有的主题(Topic)和分区(Partition)机制,结合新的消费模式和记录确认机制来实现类似队列的行为。
Kafka 发布订阅模型
共享组解决了传统 Kafka 消费者组(Consumer Groups)在某些场景下的局限性,主要体现在:
- 支持多消费者协同消费:多个消费者可以协同消费同一主题的消息,并可以同时处理同一分区的数据。每个消息在被确认之前,都会被一个时间限制的锁机制保护,确保同一时刻只有一个消费者可以尝试处理。
- 突破消费者组与分区数量的限制:共享组的消费者数量可以超过主题的分区数量,从而更好地支持高并发消费场景。而消费者组的并行消费能力受限于分区数量,这往往导致用户为了满足峰值负载下的并行消费需求而创建过多的分区,造成资源浪费。
- 消息的独立确认:支持对每条消息进行独立确认、释放或拒绝,提供更精细的消息处理能力。
- 消息投递次数记录:系统会记录每条消息的投递次数,方便处理无法处理的消息。
共享组还支持无队列深度限制和基于时间点的恢复能力,极大地扩展了 Kafka 的应用场景。
详细介绍:https://cwiki.apache.org/confluence/display/KAFKA/KIP-932%3A+Queues+for+Kafka
Kafka 常见面试题
关于 Kafka 以及其他常见消息队列的知识点/面试题总结,大家可以参考 JavaGuide 官方文档中的总结: