返回博客

Apache Kafka 3.8 新特性解读

2024年7.29日 Apache Kafka 3.8 正式发布1。该版本包含了诸多新特性与多达456个来自JIRA 的改进与修复2。AutoMQ 作为云原生的 Apache Kafka 替代产品,可以保证对 Apache Kafka 的 100% 完全兼容,因此也会尽快合并 Kafka 上游社区3

Apache Kafka 3.8 新特性解读

2024年7.29日 Apache Kafka 3.8 正式发布[1]。该版本包含了诸多新特性与多达456个来自JIRA 的改进与修复[2]。AutoMQ 作为云原生的 Apache Kafka 替代产品,可以保证对 Apache Kafka 的 100% 完全兼容,因此也会尽快合并 Kafka 上游社区3.8的最新改动。这篇文章对 Apache Kafka 3.8 的主要新特性做一个简单总结和解读。

Kafka Core

KIP-974 GraalVM Docker 镜像

GraavlVM[4] 是一款由 Oracle 推出的高性能、低资源消耗、快速启动的 JDK。利用AOT编译生成 Native Image 使得Java拥有更快的启动速度和更低的内存消耗,从而更好的适应云原生时代。

KIP 974[7] 为 Apache Kafka 提供了一个使用 KRaft 模式,基于 GraalVM 的 Native Docker Image。采用该 Native Image,可以将 Broker 的启动时间缩小到 140ms 以内(原来差不多需要3s)。更快的Broker启动速度可以使得开发者需要运行大批量的 Broker 测试的场景时更有效率。

Tips 该特性只是当前服务于测试,不要在生产环境下使用。

文章配图

KIP-1028 Docker 官方镜像

KIP-1028 引入了基于 JVM 的 Docker 官方镜像(Docker Official Image,DOI)。Docker Hub 本身也包含由 Apache 开源社区维护的镜像,例如 apache/kafka:3.8.0。但由 Apache Kafka 社区维护并通过 Docker 官方发布的 DOI,构建流程更加严格、透明,因此安全性更好。此外,作为 Docker 官方镜像,它在 Docker Hub 上也更容易被用户检索和使用。

文章配图

KIP-848 下一代 Consumer Rebalance 协议(预览)

这是一个比较重要的特性。过去 Kafka 消费者的重平衡协议主要问题是:

依赖胖客户端 :必须依赖客户端日志来排查重平衡问题,在云时代比较麻烦。新协议会把客户端的复杂性全部转移到group coordinator。

依赖消费者组维度的同步屏障 :单个行为不当的消费者可能会破坏或扰乱整个组,因为每当消费者加入、离开或失败时,都需要对整个组进行重新平衡。此外,在消费者等待重新平衡完成时,无法提交偏移量。新协议不再依赖全局同步屏障,如果消费者的分配没有改变,则消费者不会受到重新平衡的影响。

过于复杂有历史包袱 : 原来做了很多改进优化使得重平衡协议变得很复杂。此外还把组协议用于成员之间的一般状态传播,职能的扩散引发了新的复杂度以及歧义。新协议会解决这些历史问题。

KIP-719 弃用 Log4J Appender

3.8 以前是 log4j 和 log4j2 共存,一些情况下导致日志无法正确输出。3.8 将彻底弃用 log4j-appender 并将所有省略的模块(即工具、trogdor 和 shell)升级到 log4j2,以从类路径中完全删除 log4j 工件并避免上述问题。3.8在Kafka层面已经不依赖log4j了,但是用户还是可以使用log4j,但是会有warning,按照社区计划,预计是4.0 把log4j从项目真正的删除。

注意 log4j-appender 已被弃用,并将在后续版本中移除。迁移方式请参考最新官方文档。

KIP-390 支持压缩级别

开启压缩会影响生产者发送消息的效率。3.8 以前 Apache Kafka 没有提供压缩级别的配置,这使得用户无法自定义调整压缩率和性能之间的权衡。3.8 以后用户可以针对不同的压缩编码方式设置不同的压缩级别。

配置压缩级别方式如下:

compression.type=gzip
compression.gzip.level=4

不同压缩算法对应可选的压缩级别

文章配图

KIP-993 限制 File 和 Directory ConfigProvider 可访问的文件

安全性的改进。过去 Kafka 对于访问的文件和目录是无限制的,现在可以做一些限制使得其更加安全:

config.providers=directory
config.providers.directory.class=org.apache.kafka.connect.configs.DirectoryConfigProvider
config.providers.directory.param.allowed.paths=/var/run,/var/configs

KIP-1036 扩展 RecordDeserializationException

拓展 KIP-334,针对 RecordDeserializationException 这个异常额外增加record的内容和元信息,使得下游接收这个报错后可以更加容易去实现类似死信队列这样的能力。

KIP-1028 Docker 官方镜像

给 KafkaMetric 类提供一个新的方法用于判断 value provider是否是 measurable 的。相比原来的measurable的好处是,不需要依赖异常来确认是否为 mesurable,并且也避免了去访问私有字段。

/**
 * The method determines if the metric value provider is of type Measurable.
 *
 * @return true if the metric value provider is of type Measurable, false otherwise.
 */
public boolean isMeasurable();

Kafka Streams

KIP-989 改进 StateStore Iterator 指标以发现泄漏

这是针对 Kafka Streams 的优化。它通过引入一些新的 metric,让开发者更容易排查 Iterator 泄漏。

文章配图

KIP-924 支持自定义 Streams 任务分配

Task Assignor 是 KStream 中负责给节点分配任务的组件[5]。3.8 添加了一组新的可配置接口,允许用户将自定义逻辑接入 Streams Partition Assignor,从而使用自定义 Task Assignor,获得更高的灵活性。

文章配图

KIP-813 可共享 State Store

State Stores 在 KStream 里面用来保存流应用的状态数据[5]。State Stores 底层也是通过一个 topic 来实现的。过去这个 topic 不能在不同的 stream task 之间被共享,现在则可以被共享来减少数据冗余改善性能。

文章配图

Kafka Connect

KIP-1004 在 Kafka Connect 中强制执行 tasks.max

过去通过 tasks.max 来限制 Kafka Connect 生成的任务是无效的,在3.8以后可以通过该参数做强制限制。属于修复了一个历史遗留的 bug。

参考资料

[1] APACHE KAFKA 3.8.0 RELEASE ANNOUNCEMENT: https://kafka.apache.org/blog#apache_kafka_380_release_announcement

[2] Apache Kafka 3.8.0 Released: https://aiven.io/blog/apache-kafka-380-released

[3] AutoMQ: https://www.automq.com/

[4] GraalVM: https://www.graalvm.org/

[5] Apache Kafka 3.8.0 Release Announcement: https://kafka.apache.org/blog#apache_kafka_380_release_announcement

[6] GraalVM Native Image: https://www.graalvm.org/latest/reference-manual/native-image/

[7] KIP-974: https://cwiki.apache.org/confluence/display/KAFKA/KIP-974%3A+Docker+Image+for+GraalVM+based+Native+Kafka+Broker

[8] KIP-1028: https://cwiki.apache.org/confluence/display/KAFKA/KIP-1028%3A+Docker+Official+Image+for+Apache+Kafka

[9] KIP-848: https://cwiki.apache.org/confluence/display/KAFKA/KIP-848%3A+The+Next+Generation+of+the+Consumer+Rebalance+Protocol

[10] KIP-719:https://cwiki.apache.org/confluence/display/KAFKA/KIP-719%3A+Deprecate+Log4J+Appender

[11] KIP-390: https://cwiki.apache.org/confluence/display/KAFKA/KIP-390%3A+Support+Compression+Level

[12] KIP-993: https://cwiki.apache.org/confluence/display/KAFKA/KIP-993%3A+Allow+restricting+files+accessed+by+File+and+Directory+ConfigProviders

[13] KIP 1036: https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=301795741

[14] KIP-1019: https://cwiki.apache.org/confluence/display/KAFKA/KIP-1019%3A+Expose+method+to+determine+Metric+Measurability

[15] KIP-989:https://cwiki.apache.org/confluence/display/KAFKA/KIP-989%3A+Improved+StateStore+Iterator+metrics+for+detecting+leaks

[16] KIP-924: https://cwiki.apache.org/confluence/display/KAFKA/KIP-924%3A+customizable+task+assignment+for+Streams

[17] KIP-813 https://cwiki.apache.org/confluence/display/KAFKA/KIP-813%3A+Shareable+State+Stores

[18] KIP-1004 https://cwiki.apache.org/confluence/display/KAFKA/KIP-1004%3A+Enforce+tasks.max+property+in+Kafka+Connect