Apache Kafka 3.2.0 中的新功能
3.2.0 版本包含许多新功能和改进。本文将重点介绍一些最突出的新功能。有关更改的完整列表,请务必查看发行说明。您还可以观看发布视频,了解 Apache Kafka 3.2.0 中的新功能摘要。
虽然尚不建议将 KRaft 模式用于生产,但我们已经引入了基于 KRaft 的授权器以及一些修复和改进。此外,社区正在讨论 在 Apache Kafka 3.3 中将 KRaft 模式标记为生产就绪的提案。
由于 log4j 1.x 存在已知的安全漏洞并且不再维护,我们将其替换为 reload4j。reload4j 是对已知安全漏洞的修复的直接替代品。我们计划在 Apache Kafka 的下一个主要版本中迁移到 log4j 2.x。
Kafka 代理、生产者、消费者和 AdminClient
KIP-801:KRaft 的标准授权器
KIP-801引入了一个不依赖于 Zookeeper 的内置授权器 StandardAuthorizer。这意味着您现在可以在没有 Zookeeper 的情况下运行安全的 Kafka 集群!StandardAuthorizer 将其 ACL 存储在__cluster_metadata主题中,默认情况下在 KRaft 集群中使用。StandardAuthorizer 与 AclAuthorizer 对依赖于 Zookeeper 的集群所做的所有事情都是一样的。
KIP-704:向分区领导者发送提示以恢复分区
使用 KIP-704,控制器现在能够与新选举的主题分区领导者进行通信,无论它是使用不干净的领导者选举策略选举的。此信息告诉新主题分区领导者它需要恢复其状态。例如,这将在未来用于清理事务状态,这可能会在不干净的选举之后变得不一致。
KIP-764:用于创建 Acceptor 的可配置积压大小
当有许多大客户端时,首选领导者选举可以导致许多客户端在很短的时间内打开连接。这可能会导致 TCP 的接受器套接字的 SYN 积压被填满,从而导致重试延迟或生产者速度减慢。
KIP-764引入了一种新配置socket.listen.backlog.size,允许为代理上的 TCP 接受器套接字设置 SYN 积压的大小。增加此配置可以缓解许多打开连接导致的问题。
KIP-784:向 DescribeLogDirsResponse 添加顶级错误代码字段
KIP-784将错误代码添加到DescribeLogDirsAPI 的响应中。在以前的版本中DescribeLogDirs,如果用户没有请求的必要授权,则返回空响应。客户不得不将空响应解释为CLUSTER_AUTHORIZATION_FAILED错误。KIP-784 使DescribeLogDirsAPI 与其他 API 保持一致,并允许返回除CLUSTER_AUTHORIZATION_FAILED.
KIP-788:允许为每个侦听器配置 num.network.threads
在 Kafka 代理上,定义多个侦听器是很常见的。每个侦听器都有自己的网络线程池。在许多情况下,一些侦听器处理的流量比其他侦听器少得多,并且通常不需要与需要处理更多流量的侦听器相同数量的线程。
KIP-788允许为每个侦听器单独设置网络线程的池大小。这允许微调网络线程的数量以动态适应流量峰值或在使用具有不同流量负载的侦听器时略微减少内存使用量。为此,num.network.threads更新了现有配置以支持在特定侦听器上通过listener.name..num.network.threads.
KIP-798 和 KIP-810:kafka-console-producer 现在可以写入标头和空值
kafka-console-producer 是一个重要的调试工具。KIP-798提供了一种将标题添加到写入主题的记录的方法。KIP-810允许将具有价值null的记录写入主题。这意味着 kafka-console-producer 现在可以为压缩主题生成墓碑记录。这两个特性都改进了使用 kafka-console-producer 的调试。
JoinGroupRequestKIP-800:为和添加原因LeaveGroupRequest
当消费者离开或加入消费者组时,它会在本地记录原因。在此版本之前,经纪人没有任何关于消费者加入或离开消费者组的原因的信息。这使得重新平衡触发LeaveGroupRequest并JoinGroupRequest难以解决。KIP-800将离开和加入消费者组的原因传播给代理,从而更容易解决再平衡问题。
KIP-814:静态成员协议应该让领导者跳过分配
自 Apache Kafka 2.4.0 引入静态成员资格以来,消费者可以在短暂离开后重新加入消费者组,而不会触发重新平衡。如果消费者组的领导者短暂缺席然后重新加入,它将仍然是领导者。但是,没有办法让重新加入的消费者知道它仍然是领导者而不触发另一个重新平衡。最终,这可能会导致组错过一些元数据更改,例如分区增加。使用KIP-814,重新加入的领导者无需计算新任务即可获知其领导地位。
Kafka Streams
KIP-708:Kafka Streams 的机架意识
从 Apache Kafka 3.2.0 开始,Kafka Streams 可以使用KIP-708将其备用副本分布在不同的“机架”上。为了形成一个“机架”,Kafka Streams 在应用程序配置中使用标签。例如,Kafka Streams 客户端可能被标记为集群或它们正在运行的云区域。用户可以通过设置配置来指定应用于备用副本的机架感知分布的标签rack.aware.assignment.tags。在任务分配过程中,Kafka Streams 会尽力将备用副本分布在不同的任务维度上。机架感知备用分配提高了在整个“机架”发生故障的情况下的容错能力。例如,这可用于确保副本分布在云托管提供商的不同可用区域中。
KIP-796、KIP-805、KIP-806:交互式查询 v2
KIP-796为 Kafka Streams (IQv2) 中的交互式查询指定了改进的接口。新接口旨在使查询状态存储更简单、更快,并在修改现有状态存储和添加新状态存储时降低维护成本。KIP-796 描述了使用交互式查询查询状态存储的通用接口。Query通过实现接口,可以将特定查询类型添加到 Interactive Query v2 。KIP-976 还定义了KeyQuery允许用户通过 IQv2 评估键/值查找的类。
KIP-805将该RangeQuery类添加到 Interactive Query v2。该类RangeQuery是Query接口的一个实现,它允许在由上下键边界指定的范围内查询状态存储,或者在没有提供边界时扫描状态存储的所有记录。
KIP-806增加了Query接口的两个实现——WindowKeyQuery类和WindowRangeQuery类。前者允许在给定时间范围内使用给定键扫描窗口,而后者允许在给定时间范围内独立于窗口键扫描窗口。
KIP-796 是一个长期项目,将在未来版本中使用新的查询类型进行扩展。从 Apache Kafka 3.2.0 开始,IQv2 处于预览阶段。公共文档站点尚未更新,IQv2 的接口被标记为@Evolving(意味着如果预览用户发现当前 API 存在重大缺陷,它们可能会在没有弃用期的小版本中破坏兼容性)。未来版本将删除@Evolving注释并将 IQv2 指定为稳定版本。
KIP-791:将记录元数据添加到状态存储上下文
KIP-791recordMetada()向 中添加方法StateStoreContext,提供对当前正在处理的记录的主题、分区和偏移量的访问。以这种方式公开当前上下文允许状态存储跟踪它们在每个输入分区中的当前偏移量,从而允许它们实现 KIP-796 中引入的一致性机制。
Kafka Connect
KIP-769:连接 API 以列出所有连接器插件并检索其配置定义
KIP-769使用新的查询参数扩展GET /connector-plugins端点connectorsOnly,当设置为false列出所有可用插件而不仅仅是连接器时。新的查询参数可帮助用户验证哪些插件可用,而无需知道如何设置 Connect 运行时。新参数的用法是GET /connector-plugins?connectorsOnly=false。默认情况下connectorsOnly设置true为与以前的行为兼容。
此外,KIP-769 添加了一个新端点,它将返回给定插件的配置。新端点的使用方式如下:GET /connector-plugins//config. 新端点适用于所有由GET /connector-plugins.
KIP-808:在 TimestampConverter SMT 中添加对不同 Unix 时间精度的支持
KIP-808unix.precision为SMT引入了一个新的可选配置字段TimestampConverter,允许用户为 SMT 定义所需的精度。此新字段的有效值为秒、毫秒、微秒和纳秒。这种添加的动机是在外部系统中 Unix 时间以不同的精度表示。
KIP-779:允许源任务处理生产者异常
KIP-779使源连接器对生产者异常具有弹性。由于源连接器从系统用户获取数据无法控制,因此可能会发生接收到的消息太大或无法处理配置的 Connect 工作线程、Kafka 代理和其他生态系统组件的情况。以前这样的错误总是会杀死连接器。
使用 KIP-779发送消息时WorkerSourceTask检查配置error.tolerance失败。如果error.tolerance设置为all,WorkerSourceTask则将忽略异常,允许连接器确认其源系统并继续处理。如果error.tolerance未设置为all,源连接器将失败。
关于兼容性的说明:设置errors.tolerance为all并预期在生产者失败时终止的现有源连接器将需要按照 KIP 中的描述进行更新。errors.tolerance未设置为的源连接器all将不受此更改的影响,并在生产者失败的情况下被终止。
Summary
除了上面列出的所有 KIP,Apache Kafka 3.2.0 还包含修复和其他改进。对于后续步骤:
- 有关更改的完整列表,请参阅发行说明
- 查看视频或播客以了解更多信息
- 下载 Apache Kafka 3.2.0 以开始使用最新版本