Real runs. Real disk. Reproducible.
How StreamFlow performs across throughput and latency — measured on the same hardware, with the official Kafka tools, against Apache Kafka and Redpanda. No mocks, no in-memory fakes, no simulated transports.
StreamFlow vs Apache Kafka vs Redpanda
The only fair comparison: three broker backends, the same official kafka-*-perf-test tools, the same AWS cluster, the Kafka API on :9092.
Produce throughput
records / second · higher is betterConsume throughput
records / second · higher is betterBeyond the Kafka wire — zero Kafka in the path
StreamFlow has its own binary transport. On the same AWS cluster, off the Kafka protocol entirely:
What the engine writes to disk
DirectIOBenchmark — multi-shard, group-commit, real disk writes. 4-vCPU host, Oracle JDK 25, FileChannel / Panama FFM backends.
Reproduce it yourself
Every number above is from a real run. Here is exactly how — same tools, same config.
| Hardware | AWS · 3× m6id.2xlarge brokers + 1× c6i.xlarge load generator |
| Tools | Apache Kafka 3.7.0 — kafka-producer-perf-test / kafka-consumer-perf-test |
| Workload | 1,000,000 records · 256-byte payload · 16 partitions |
| Durability | acks=1 · replication factor RF=3 · warm run (JIT hot) |
| Broker builds | StreamFlow (this release) · apache/kafka:3.7.0 (KRaft) · redpandadata/redpanda:v24.1.7 |
| Storage engine | DirectIOBenchmark · 4-vCPU · Oracle JDK 25 · FileChannel / Panama FFM |
One line each — the shipped CLI wraps both benchmarks
1# storage engine — native disk hot path, every backend, no network, no Kafka
2java -Xmx4g --enable-native-access=ALL-UNNAMED -cp streamflow.jar \
3 com.streamflow.app.cli.StreamFlowCli bench disk
4
5# Kafka wire — stock kafka-clients 3.7.0 against StreamFlow's Kafka port (or any broker)
6java -cp streamflow.jar com.streamflow.app.cli.StreamFlowCli \
7 bench kafka --bootstrap $NODE:9092bench disk is the same measurement as the DirectIOBenchmark JUnit test, packaged to run from the jar. bench kafka uses the exact canonical flags (acks=1, batch.size=65536, linger.ms=5). Run every benchmark twice and report the warm (JIT-hot) run.
Same numbers the raw way — Apache perf tools + the repo
1# produce — 1M records, 256B, acks=1, RF=3 topic
2kafka-producer-perf-test --topic bench --num-records 1000000 --record-size 256 \
3 --throughput -1 --producer-props bootstrap.servers=$NODE:9092 acks=1 \
4 batch.size=65536 linger.ms=5
5
6# consume — same 1M records
7kafka-consumer-perf-test --topic bench --messages 1000000 \
8 --bootstrap-server $NODE:9092
9
10# storage engine — native disk hot path from the StreamFlow repo
11mvn -q -Plarge-heap test -Dtest=DirectIOBenchmark -pl streamflow-coreThe CLI wrappers above and these raw commands measure the same paths — pick whichever you have on hand.
The honest caveats
Transparency is the point. If a benchmark can't be reproduced or is quietly favourable, it isn't worth publishing.
Numbers are cheap. Run it.
Spin up a cluster, point the official Kafka tools at it, and reproduce the table above — or build a live app in the browser in 3 minutes.