Current state: Under Discussion
Discussion thread:
JIRA:
kafka-producer-perf-test is the standard tool for benchmarking Kafka producer throughput and latency. However, it currently always creates records with a null key, which means all messages are distributed across partitions via round-robin.
In production workloads, producers commonly send messages with keys to leverage semantic partitioning — ensuring that records with the same key always land on the same partition.
This proposal adds two new command-line arguments to kafka-producer-perf-test:
Controls how message keys are assigned:
Defines the size of the key space. Must be a positive integer.
public enum KeyDistribution {
NONE, RANGE, RANDOM
} |
Keys are serialized as their decimal string representation encoded in UTF-8, consistent with the ByteArraySerializer already configured for the producer. This keeps keys human-readable in tools like kafka-console-consumer.
| Distribution | Key value |
|---|---|
| NONE | null |
| RANGE | Integer.toString(recordIndex % keyRange) |
RANDOM | Integer.toString(random.nextInt(keyRange)) |
ConfigPostProcessor enforces mutual consistency between the two new arguments:
| Condition | Error |
|---|---|
| --key-distribution range or random without --message-key-range | --message-key-range is required when --key-distribution is 'range' or 'random'. |
| --message-key-range specified with --key-distribution none | --key-distribution must be 'range' or 'random' when --message-key-range is specified. |
| --message-key-range ≤ 0 | --message-key-range should be greater than zero. |
bin/kafka-producer-perf-test.sh \ --topic my-topic --num-records 1000000 --record-size 1024 \ --throughput -1 --bootstrap-server localhost:9092 |
bin/kafka-producer-perf-test.sh \ --topic my-topic --num-records 1000000 --record-size 1024 \ --throughput -1 --bootstrap-server localhost:9092 \ --key-distribution range --message-key-range 100 |
bin/kafka-producer-perf-test.sh \ --topic my-topic --num-records 1000000 --record-size 1024 \ --throughput -1 --bootstrap-server localhost:9092 \ --key-distribution random --message-key-range 10000 |
The default value of --key-distribution is none, which preserves the current behavior of sending null-key records. Existing scripts and benchmarks continue to work without modification.
All remaining tests should pass, and new unit test.
n/a