Apache Kafka 4.4.0 Release Announcement
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
KIP-1232: Deprecate broker.id config Deprecates the
broker.idbroker configuration.KIP-1200: Deprecate ClientQuotaCallback#updateClusterMetadata Deprecates the
ClientQuotaCallback#updateClusterMetadatamethod and will be removed in Kafka 5.0. Custom implementations ofClientQuotaCallbackno 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 thekafka.server:type=group-coordinator-metricsMBean.
Kafka Broker, Controller, Producer, Consumer and Admin Client
KIP-1170: Unify cluster metadata bootstrapping Storage directories formatted by the
kafka-storagetool are no longer forward-compatible: a broker must now be the same version as, or newer than, thekafka-storagetool that formatted its directory, regardless of the--release-versionchosen at format time.KIP-1191: Dead-letter queues for share groups Share groups now support dead-letter queues. Records that are released beyond the max delivery count, or rejected by the share consumer, become eligible for the DLQ once the
share.versionfeature is upgraded to 2. DLQ behavior is configured dynamically viaerrors.deadletterqueue.topic.name,errors.deadletterqueue.auto.create.topics.enable,errors.deadletterqueue.group.enable,errors.deadletterqueue.topic.name.prefix, anderrors.deadletterqueue.copy.record.enable.KIP-909: Allow Clients to Rebootstrap Upon Failed DNS Resolution Adds a new client configuration,
bootstrap.resolve.timeout.ms, controlling how DNS resolution ofbootstrap.serversis performed. The default of0preserves the historical synchronous behavior; a positive value opts into asynchronous bootstrap resolution, where the client constructor returns immediately and failures surface later asBootstrapResolutionException. 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-checkermechanism, based on explicit@InterfaceAudienceannotations, 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
TxnOffsetCommitv6, bringing the transactional offset commit API to parity withOffsetCommit: it now carries topic IDs instead of topic names, renamesGenerationIdtoGenerationIdOrMemberEpoch, and surfaces granular error codes such asGROUP_ID_NOT_FOUND,STALE_MEMBER_EPOCH, andUNKNOWN_TOPIC_IDinstead of collapsing them intoILLEGAL_GENERATION.KIP-1312: Support unregistering controllers Controllers can now be unregistered from the cluster metadata. A new
kafka-cluster.sh unregister-controllercommand and a--unregisterflag onkafka-metadata-quorum.sh remove-controllerare provided, backed by the newAdmin#unregisterControllerAPI andUnregisterControllerRPC. This introduces the error codeCONTROLLER_ID_NOT_REGISTERED(136) and requires metadata version4.4-IV2.KIP-1220: Add an api-versions command to kafka-cluster.sh The
kafka-cluster.shtool now provides anapi-versionscommand to display the API versions supported by the brokers or controllers, accepting both--bootstrap-serverand--bootstrap-controller. As a result,kafka-broker-api-versions.shis deprecated and will be removed in the next major release; usekafka-cluster.sh api-versionsinstead.KIP-1241: Reduce tiered storage redundancy with delayed upload Introduces the
remote.copy.lag.bytesandremote.copy.lag.msconfigs, with corresponding broker-level configurations, allowing tiered storage redundancy to be reduced with delayed upload.KIP-1242: Detect and handle misrouted client connections 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/iovia JMX, addinglinux-disk-rchar,linux-disk-wchar,linux-disk-syscr,linux-disk-syscw, andlinux-disk-cancelled-write-bytesalongside 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.shtool now supports--record-key-range,--key-distribution, and--random-seedoptions to control the distribution of record keys. Use--key-distribution rangefor sequential (round-robin) key assignment orrandomfor random key selection, with--random-seedenabling reproducible benchmark runs.KIP-1323: Initialize share group offsets from a file The
kafka-share-groups.shtool 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
ValueJoinerWithStreamAndMappedKeyjoiner interface and newKStream#join/leftJoinoverloads 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 existingValueJoinerWithKey-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.classis set, Kafka Streams clients automatically push a description equivalent toTopology#describe()to the group coordinator, retrievable viaAdmin#describeStreamsGroupsorkafka-streams-groups.sh --describe --topology— without access to the application’s source code.KIP-1357: Broker-side custom task assignors for Streams groups Streams groups now support broker-side custom task assignors, registered via the new broker configuration
group.streams.assignorsand selected per group with the new group configurationstreams.assignor.name.KIP-892: Transactional Semantics for StateStores Adds transactional state stores, enabled with the new config
enable.transactional.statestores(defaultfalse). 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 configsstatestore.uncommitted.max.bytesanddefault.interactive.query.isolation.levelcontrol 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.KIP-1321: Headers aware StreamPartitioner
StreamPartitionergets a newpartitions(topic, key, value, headers, numPartitions)method that receives record headers. The existing method without headers is deprecated.KIP-1284: Introduce CloseOptions.DEFAULT for Kafka Streams Adds
GroupMembershipOperation.DEFAULT, now the default forCloseOptions. 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.KIP-1245: Enforce ‘application.server’ format at config level
application.serveris now validated whenStreamsConfigis created and must be empty or a validhost:portendpoint. Invalid values fail early with aConfigException.
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.enableconfiguration (defaulttrue). When set tofalse, 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 newconnect-internal-topics.shtool 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