Data Platform & Analytics · Chapter 11 of 16
Streaming internals, and what the benchmarks are worth
The coordinator moved server-side, the ZooKeeper era ended, storage went to object stores — and the one independently-retested vendor benchmark did not reproduce.
Apache Kafka and its competitors changed more between 2024 and 2026 than in the preceding five years, and most teaching material predates all of it. This chapter is the current mechanics and an unusually clear lesson about vendor benchmarks.
The coordination layer, and the upgrade you cannot skip
- Kafka 4.0 (March 2025) removed ZooKeeper entirely — removed, not deprecated. Metadata now lives in an internal consensus log, KRaft.
- The upgrade constraint that catches people: you cannot jump from a ZooKeeper cluster straight to 4.x. You must already be on 3.3 or later and already migrated to KRaft. Kafka 3.9 exists specifically as that bridge.
- Other breaks in the same release: the oldest message formats gone, old client protocol versions gone, and a Java version floor that differs between clients and brokers. Any material treating the coordination service as current is two major versions stale.
The rebalance protocol, and the detail everyone gets wrong
KIP-848 rewrote the consumer group rebalance protocol, and this is the most commonly misrepresented item in current material.
It is generally available on the broker and it is NOT the default for consumers. The client must set group.protocol=consumer; the default remains classic.
What changed mechanically: assignment moved server-side. The group coordinator computes assignments and pushes them incrementally, so there is no global synchronisation barrier — and therefore no stop-the-world rebalance. Most consumers keep processing while a rebalance happens.
What is still missing: client-side assignors and full rack-aware assignment. If you rely on a custom partition assignor, you cannot migrate yet, and that is the question to ask before planning the work.
Migration can be an online rolling upgrade — the two protocols interoperate within a group during the transition, which is unusually kind for a protocol change of this size.
Kafka Streams got its own equivalent with a dedicated group type, which reached general availability with a limited feature set one release later.
Tiered storage, and the diskless direction
Tiered storage — hot segments on local disk, completed segments on object storage, invisible to producers and consumers — became production-ready in the last 3.x release. The real benefit is not storage cost: it is that brokers no longer copy cold data during reassignment, so scaling and rebalancing get dramatically faster.
The further step is diskless: write straight to object storage with no local replication at all. WarpStream and others ship it commercially and KIP-1150 was formally accepted upstream in March 2026 — but be precise here, because the marketing is not: it is a directional proposal, and the implementation is not in mainline. The only running implementations are vendor forks and managed products.
And the tradeoff nobody leads with: writing directly to object storage pushes produce latency into the hundreds of milliseconds. The economics are real — cross-zone network transfer and attached block storage are what you are eliminating, and one vendor's own price list shows storage dropping around 60% on its relaxed-latency tier. But it buys cost with latency, and any material presenting diskless as free is wrong.
What exactly-once actually guarantees
The transactional machinery got a genuine correctness improvement: server-side defences are now automatically enabled, and with current clients the producer epoch is bumped on every transaction. That closes the hanging-transaction and zombie-write holes — which matter because a hanging transaction pins the last stable offset, which stalls every read-committed consumer and stops log compaction.
But be precise about what the guarantee covers. There are four mechanisms and they are frequently conflated:
- The idempotent producer deduplicates by producer, epoch and sequence — per partition, per producer session. It is not application-level deduplication.
- Transactions make a write across several partitions atomic together with the consumer offset commit.
- Read-committed consumers read only up to the last stable offset, skipping aborted batches.
- Fencing bumps the epoch when a transactional identifier is re-registered, which is how a zombie instance is stopped.
- What none of it gives you is exactly-once into a sink outside the system. ‘Exactly-once’ here means effectively-once within the platform's own boundary, and stating it that way is the answer that shows you have operated one.
The canonical lesson about vendor benchmarks
Redpanda built its marketing on a headline of roughly ten times better tail latency with a third of the nodes.
Jack Vanlightly re-ran it independently and the result did not reproduce. The advantage disappeared when the producer count was raised from four to fifty. The system could not reach the claimed throughput with transport encryption enabled at all. Independent same-hardware testing found roughly a 25% advantage in the most favourable configuration, and the incumbent winning when durability was set to full acknowledgement — with the original headline apparently coming from a comparison against an older, untuned deployment.
Teach this as the reference case. Every vendor in streaming publishes a multiple: ten times, three times, fifteen times, ninety percent savings. The one case that received published independent scrutiny did not survive it.
The correct posture is not cynicism, it is specificity: what was the producer count, the acknowledgement setting, the partition count, was encryption on, and who configured the comparison? Ask those five questions and most published multiples evaporate.
Choosing a platform, honestly
| Option | Genuinely for | Genuinely not for |
|---|---|---|
| Self-managed Apache Kafka | Full control, no per-GB pricing, portability | Small teams — the operational surface is substantial and it is not the interesting part of your job |
| Managed Kafka (Confluent, MSK, Aiven) | Keeping the ecosystem — connectors, change-data capture, stream processing, portability | Anyone who wants zero operations; you still size and tune |
| Object-storage-native (WarpStream, Kafka diskless) | High-volume, latency-tolerant workloads paying large cross-zone bills — the saving is networking, not compute | Anything latency-sensitive. Hundreds of milliseconds is the price |
| Cloud-native queue (Kinesis, Pub/Sub, EventBridge) | Greenfield work under roughly a terabyte a day where you want no operations at all | Anywhere portability matters — you are locked in at the protocol, not just the vendor |
| Apache Pulsar | Multi-tenant platform teams needing geo-replication and tenancy natively | A default. The technical case is good and the ecosystem gravity is overwhelmingly elsewhere |
And the commercial context worth knowing: IBM completed its acquisition of Confluent in March 2026, at an enterprise value around eleven billion dollars. Several of the interesting smaller companies were acquired in the same window. That does not change the protocol, and it changes your negotiating position.
Check yourself