Introducing Apache Kafka 4.4.0

Source: Confluent•

Introducing Apache Kafka 4.4.0

The Apache Software Foundation is proud to announce the release of Apache Kafka® 4.4.0. This release contains many new features and improvements.

Apache Kafka 4.4.0 Release Announcement

By Omnia Ibrahim | Thursday, October 22, 2026

We are proud to announce the release of Apache Kafka® 4.4.0. This release contains many new features and improvements. This blog post will highlight some of the more prominent ones. For a full list of changes, be sure to check the release notes.

With 25 KIPs and 963 commits since 4.3.0, this release introduces many new features, improvements and bug fixes to all the components.

See the Upgrading to 4.4 section in the documentation for the list of notable changes and detailed upgrade steps.

Deprecation Notices

Deprecates the broker.id broker configuration.

Deprecates the ClientQuotaCallback#updateClusterMetadata method and will be removed in Kafka 5.0. Custom implementations of ClientQuotaCallback no longer need to override this method, as a default no-op implementation is now provided.

  • KIP-1301: Deprecate Yammer-based metrics in GroupCoordinatorMetrics Deprecates the remaining Yammer-based classic-group metrics in GroupCoordinatorMetrics (NumGroups, NumOffsets, NumGroupsPreparingRebalance, NumGroupsCompletingRebalance, NumGroupsStable, NumGroupsDead), replacing them with equivalent Kafka Metrics gauges registered under the kafka.server:type=group-coordinator-metrics MBean.

Deprecates the remaining Yammer-based classic-group metrics in GroupCoordinatorMetrics (NumGroups, NumOffsets, NumGroupsPreparingRebalance, NumGroupsCompletingRebalance, NumGroupsStable, NumGroupsDead), replacing them with equivalent Kafka Metrics gauges registered under the kafka.server:type=group-coordinator-metrics MBean.

Kafka Broker, Controller, Producer, Consumer and Admin Client

  • KIP-1170: Unify cluster metadata bootstrapping Storage directories formatted by the kafka-storage tool are no longer forward-compatible: a broker must now be the same version as, or newer than, the kafka-storage tool that formatted its directory, regardless of the --release-version chosen at format time.

Storage directories formatted by the kafka-storage tool are no longer forward-compatible: a broker must now be the same version as, or newer than, the kafka-storage tool that formatted its directory, regardless of the --release-version chosen at format time.

  • KIP-909: Allow Clients to Rebootstrap Upon Failed DNS Resolution Adds a new client configuration, bootstrap.resolve.timeout.ms, controlling how DNS resolution of bootstrap.servers is performed. The default of 0 preserves the historical synchronous behavior; a positive value opts into asynchronous bootstrap resolution, where the client constructor returns immediately and failures surface later as BootstrapResolutionException. This is an evolving feature and may change in a minor release. Kafka Streams and Kafka Connect do not yet support asynchronous bootstrap resolution.

Adds a new client configuration, bootstrap.resolve.timeout.ms, controlling how DNS resolution of bootstrap.servers is performed. The default of 0 preserves the historical synchronous behavior; a positive value opts into asynchronous bootstrap resolution, where the client constructor returns immediately and failures surface later as BootstrapResolutionException. This is an evolving feature and may change in a minor release. Kafka Streams and Kafka Connect do not yet support asynchronous bootstrap resolution.

  • KIP-1265: Mechanism for automatic detection of internal API usage Introduces a build-time api-checker mechanism, based on explicit @InterfaceAudience annotations, that fails the build if an internal class is imported by or exposed through a public API — preventing internal classes from unintentionally leaking into Kafka’s public surface.

Introduces a build-time api-checker mechanism, based on explicit @InterfaceAudience annotations, that fails the build if an internal class is imported by or exposed through a public API — preventing internal classes from unintentionally leaking into Kafka’s public surface.

  • KIP-1319: Align TxnOffsetCommit API with OffsetCommit API Introduces TxnOffsetCommit v6, bringing the transactional offset commit API to parity with OffsetCommit: it now carries topic IDs instead of topic names, renames GenerationId to GenerationIdOrMemberEpoch, and surfaces granular error codes such as GROUP_ID_NOT_FOUND, STALE_MEMBER_EPOCH, and UNKNOWN_TOPIC_ID instead of collapsing them into ILLEGAL_GENERATION.

Introduces TxnOffsetCommit v6, bringing the transactional offset commit API to parity with OffsetCommit: it now carries topic IDs instead of topic names, renames GenerationId to GenerationIdOrMemberEpoch, and surfaces granular error codes such as GROUP_ID_NOT_FOUND, STALE_MEMBER_EPOCH, and UNKNOWN_TOPIC_ID instead of collapsing them into ILLEGAL_GENERATION.

  • KIP-1312: Support unregistering controllers Controllers can now be unregistered from the cluster metadata. A new kafka-cluster.sh unregister-controller command and a --unregister flag on kafka-metadata-quorum.sh remove-controller are provided, backed by the new Admin#unregisterController API and UnregisterController RPC. This introduces the error code CONTROLLER_ID_NOT_REGISTERED (136) and requires metadata version 4.4-IV2.

Controllers can now be unregistered from the cluster metadata. A new kafka-cluster.sh unregister-controller command and a --unregister flag on kafka-metadata-quorum.sh remove-controller are provided, backed by the new Admin#unregisterController API and UnregisterController RPC. This introduces the error code CONTROLLER_ID_NOT_REGISTERED (136) and requires metadata version 4.4-IV2.

  • KIP-1220: Add an api-versions command to kafka-cluster.sh The kafka-cluster.sh tool now provides an api-versions command to display the API versions supported by the brokers or controllers, accepting both --bootstrap-server and --bootstrap-controller. As a result, kafka-broker-api-versions.sh is deprecated and will be removed in the next major release; use kafka-cluster.sh api-versions instead.

The kafka-cluster.sh tool now provides an api-versions command to display the API versions supported by the brokers or controllers, accepting both --bootstrap-server and --bootstrap-controller. As a result, kafka-broker-api-versions.sh is deprecated and will be removed in the next major release; use kafka-cluster.sh api-versions instead.

Introduces the remote.copy.lag.bytes and remote.copy.lag.ms configs, with corresponding broker-level configurations, allowing tiered storage redundancy to be reduced with delayed upload.

When clients connect to the cluster, they now include cluster and node information to enable detection and handling of misrouted connections.

  • KIP-1291: Expose additional Linux I/O metrics via JMX The Linux I/O metrics collector now exposes all 7 fields from /proc/self/io via JMX, adding linux-disk-rchar, linux-disk-wchar, linux-disk-syscr, linux-disk-syscw, and linux-disk-cancelled-write-bytes alongside the existing read/write byte metrics. These let operators calculate page-cache hit ratios, detect write amplification, identify inefficient syscall patterns, and monitor log-compaction I/O activity.

The Linux I/O metrics collector now exposes all 7 fields from /proc/self/io via JMX, adding linux-disk-rchar, linux-disk-wchar, linux-disk-syscr, linux-disk-syscw, and linux-disk-cancelled-write-bytes alongside the existing read/write byte metrics. These let operators calculate page-cache hit ratios, detect write amplification, identify inefficient syscall patterns, and monitor log-compaction I/O activity.

  • KIP-1299: Control key distribution in kafka-producer-perf-test The kafka-producer-perf-test.sh tool now supports --record-key-range, --key-distribution, and --random-seed options to control the distribution of record keys. Use --key-distribution range for sequential (round-robin) key assignment or random for random key selection, with --random-seed enabling reproducible benchmark runs.

The kafka-producer-perf-test.sh tool now supports --record-key-range, --key-distribution, and --random-seed options to control the distribution of record keys. Use --key-distribution range for sequential (round-robin) key assignment or random for random key selection, with --random-seed enabling reproducible benchmark runs.

The kafka-share-groups.sh tool can now be used to initialize share group offsets from a file, enabling a share group to be initialized from the committed offsets of a consumer group.

Kafka Streams

  • KIP-1340: Expose Both Mapped Key and Stream Key in Streams-GlobalKTable Joins Adds a new ValueJoinerWithStreamAndMappedKey joiner interface and new KStream#join/leftJoin overloads for KStream-GlobalKTable joins, giving users access to both the mapped join key and the original stream record key without having to recompute it. The existing ValueJoinerWithKey-based overloads are deprecated but unchanged in behavior.

Adds a new ValueJoinerWithStreamAndMappedKey joiner interface and new KStream#join/leftJoin overloads for KStream-GlobalKTable joins, giving users access to both the mapped join key and the original stream record key without having to recompute it. The existing ValueJoinerWithKey-based overloads are deprecated but unchanged in behavior.

  • KIP-1331: Streams Group Topology Description Plugin Lets brokers record a human-readable description of a Streams group’s processing topology via a pluggable backend. When group.streams.topology.description.plugin.class is set, Kafka Streams clients automatically push a description equivalent to Topology#describe() to the group coordinator, retrievable via Admin#describeStreamsGroups or kafka-streams-groups.sh --describe --topology — without access to the application’s source code.

Lets brokers record a human-readable description of a Streams group’s processing topology via a pluggable backend. When group.streams.topology.description.plugin.class is set, Kafka Streams clients automatically push a description equivalent to Topology#describe() to the group coordinator, retrievable via Admin#describeStreamsGroups or kafka-streams-groups.sh --describe --topology — without access to the application’s source code.

Streams groups now support broker-side custom task assignors, registered via the new broker configuration group.streams.assignors and selected per group with the new group configuration streams.assignor.name.

  • KIP-892: Transactional Semantics for StateStores Adds transactional state stores, enabled with the new config enable.transactional.statestores (default false). When enabled, state stores are no longer wiped and rebuilt on error under exactly-once processing; only writes since the last successful commit are lost and replayed. New configs statestore.uncommitted.max.bytes and default.interactive.query.isolation.level control the uncommitted buffer size and the isolation level of interactive queries.

Adds transactional state stores, enabled with the new config enable.transactional.statestores (default false). When enabled, state stores are no longer wiped and rebuilt on error under exactly-once processing; only writes since the last successful commit are lost and replayed. New configs statestore.uncommitted.max.bytes and default.interactive.query.isolation.level control the uncommitted buffer size and the isolation level of interactive queries.

  • KIP-1356: Introduce IQv2 for headers-aware state stores Adds four IQv2 query types (TimestampedKeyWithHeadersQuery, TimestampedRangeWithHeadersQuery, TimestampedWindowKeyWithHeadersQuery, TimestampedWindowRangeWithHeadersQuery) that return record headers from the headers-aware state stores introduced by KIP-1271.

Adds four IQv2 query types (TimestampedKeyWithHeadersQuery, TimestampedRangeWithHeadersQuery, TimestampedWindowKeyWithHeadersQuery, TimestampedWindowRangeWithHeadersQuery) that return record headers from the headers-aware state stores introduced by KIP-1271.

  • KIP-1321: Headers aware StreamPartitioner StreamPartitioner gets a new partitions(topic, key, value, headers, numPartitions) method that receives record headers. The existing method without headers is deprecated.

StreamPartitioner gets a new partitions(topic, key, value, headers, numPartitions) method that receives record headers. The existing method without headers is deprecated.

Adds GroupMembershipOperation.DEFAULT, now the default for CloseOptions. Under the streams rebalance protocol, dynamic members leave the group on close while static members remain.

  • KIP-1283: Clarify KafkaStreams cleanUp semantics KafkaStreams#cleanUp() no longer logs a WARN when the state directory cannot be removed only because the process metadata and lock files remain. The cleanup is treated as successful in that case.

KafkaStreams#cleanUp() no longer logs a WARN when the state directory cannot be removed only because the process metadata and lock files remain. The cleanup is treated as successful in that case.

application.server is now validated when StreamsConfig is created and must be empty or a valid host:port endpoint. Invalid values fail early with a ConfigException.

Kafka Connect

  • KIP-1209: Add configuration to control internal topic creation in Kafka Connect Kafka Connect distributed workers now support the internal.topics.automatic.creation.enable configuration (default true). When set to false, Connect will not automatically create its internal topics (offset, config, status, and connector-specific offset topics) and instead fails at startup if any are missing. A new connect-internal-topics.sh tool is provided for creating these topics manually.

Kafka Connect distributed workers now support the internal.topics.automatic.creation.enable configuration (default true). When set to false, Connect will not automatically create its internal topics (offset, config, status, and connector-specific offset topics) and instead fails at startup if any are missing. A new connect-internal-topics.sh tool is provided for creating these topics manually.

Summary

Ready to get started with Apache Kafka 4.4.0? Check out all the details in the upgrade notes and the release notes, and download Apache Kafka 4.4.0.

This was a community effort, so thank you to everyone who contributed to this release, including all our users and our 151 contributors (and 8 AIs): Matthias J. Sax, Ken Huang, Mickael Maison, Nick Telford, Sushant Mahajan, majialong, PoAn Yang, David Jacot, Murali Basani, Alieh Saeedi, Lianet Magrans, Bill Bejeck, Ming-Yen Chung, Sean Quah, Andrew Schofield, Apoorv Mittal, TengYao Chi, ChickenchickenLove, Sanskar Jhajharia, Gabriella Fu, Lucy Liu, Maros Orsak, nileshkumar3, Evan Zhou, YANG-SYUAN CHOU, Alan Lau, Jess668, Lucas Brutschy, Uladzislau Blok, Chia-Yi Chiu, Eric Chang, Federico Valeri, Kuan-Po Tseng, Aditya Kousik, Gaurav Narula, Nikita Shupletsov, TaiJuWu, Gavin Wang, Jiayao Sun, Shekhar Prasad Rajak, Chih-Yuan Chien, Eduwer Camacaro, Gergely Harmadas, Manikumar Reddy, Mingi Cho, Paolo Patierno, Ivan Yurchenko, Nick Guo, Omnia Ibrahim, gomudayya, sstremler, Bolin Lin, Christo Lolov, CoderBruis, Dejan Stojadinović, Dongnuo Lyu, Edoardo Comar, Igor Soarez, Jian, KC.H, Kevin Wu, Lan Ding, LeiXiaoGao, Parker Chang, Russole Chen, Sebastien Viale, yangxuze, Adam Souquières, Arpit Goyal, Avishek Das, Gabriel Dutra, Hector Geraldino, Jakub Scholz, Kai Jay Tu, Kartikay Dubey, Kirk True, Luke Chen, Park Jiwon, RonGamzu, Sahil Devgon, Yunchi Pang, Zheguang Zhao, Zhiyan Tang, ashwinpankaj, dependabot[bot], gabriellefu, mannoopj, red-flames, zoo-code, 조형준, Abhijeet Kumar, Adam Horky, Alyssa Huang, Amir Sarabadani, Andy Huang, Angelo R., Anton Liauchuk, Aravind Reveendran, Arnab Nandy, Arpit Jain, Atharv Chavan, Brian Sang, Chang-Chi Hsu, Charlie Zhang, Daeho Kwon, Daniel Tschinder, David Simon, Davide Armand, Derek Ko, Diya Hussein, Dmitry Werner, Fatorin, Ganesh Manchi, Gimin Kim, Gyeongwon Do, Hana, Ivan Malutin, Joanna-D, Jonah Hooper, José Armando García Sancio, Kamal Chandraprakash, Kenan Adel, Kondrat Bertalan, Lucas Ma, Mirko Alicastro, Nandini Singhal, Nikolaus Schuetz, Nishant Kumar, Prabhash Kumar, Rajarshi Misra, Rion Williams, Ritika Reddy, Ritikj55, S.Y. Wang, Sepuri Sai Krishna, Shivsundar R, Siddhartha Devineni, Taeik Lim, Tamas Kornai, Tommi Vainikainen, Truc Nguyen, Viktor Somogyi-Vass, Xi, Yu-Chia Ma, akhil-sabu-ibm, amandayclee, averemee-si, minjcho, subbudvk, winfriedgerlach

What this article says