Understanding Message Compression
1. Understanding Compression Benefits
| Benefit | Description | Detail |
|---|---|---|
| Network | Less bandwidth used | Per batch |
| Storage | Smaller on-disk logs | Stored compressed |
| Throughput | More records per request | Batch-level |
Example: Enable producer compression
props.put("compression.type", "lz4");
props.put("linger.ms", 20); // larger batches compress better
2. Using GZIP Compression
| Aspect | Value | Detail |
|---|---|---|
| Ratio | Highest | Best size reduction |
| CPU | High | Slowest |
| Use Case | Bandwidth-constrained | Cold paths |
3. Using Snappy Compression
| Aspect | Value | Detail |
|---|---|---|
| Ratio | Moderate | Balanced |
| CPU | Low | Fast |
| Use Case | General throughput | Popular |
4. Using LZ4 Compression
| Aspect | Value | Detail |
|---|---|---|
| Ratio | Good | Solid |
| CPU | Very low | Fastest decompress |
| Use Case | Low-latency high throughput | Recommended default |
5. Using ZSTD Compression
| Aspect | Value | Detail |
|---|---|---|
| ZSTD NEW | Best ratio/CPU balance | Since 2.1 |
| Tunable | Level 1–22 | Configurable |
| Use Case | Maximize savings + speed | Modern default |
6. Configuring Compression Level
| Config | Description | Detail |
|---|---|---|
| compression. gzip.level |
GZIP level 1–9 | Broker/topic |
| compression. zstd.level |
ZSTD level 1–22 | Higher=smaller |
| compression. lz4.level |
LZ4 level | Default fast |
7. Understanding Compression Ratio
| Type | Typical Ratio | Speed |
|---|---|---|
| gzip | ~4-5x | Slow |
| zstd | ~4-5x | Medium |
| snappy | ~2-3x | Fast |
| lz4 | ~2-3x | Fastest |
Example: Monitor compression ratio
# JMX: kafka.producer:type=producer-metrics,client-id=*
# attribute: compression-rate-avg (1.0 = no compression)
8. Comparing Compression Performance
Example: Benchmark settings
kafka-producer-perf-test.sh --topic bench --num-records 1000000 \
--record-size 1024 --throughput -1 \
--producer-props bootstrap.servers=localhost:9092 compression.type=zstd
9. Setting Producer Compression
| Aspect | Description | Detail |
|---|---|---|
| compression.type | Producer-side compression | Applied per batch |
| Scope | Whole record batch | Not per record |
| Override | Topic config can force re-compress | See 12.10 |
Example: Producer compression
props.put("compression.type", "zstd");
props.put("batch.size", 131072);
10. Broker Compression Handling
| Value | Behavior | Detail |
|---|---|---|
| producer | Keep producer's codec | Default, zero-copy |
| specific codec | Broker re-compresses | Extra CPU |
| uncompressed | Store decompressed | Rare |
Example: Broker compression config
# server.properties — keep producer codec (no recompression)
compression.type=producer
11. Monitoring Compression Metrics
| Metric | Description | Source |
|---|---|---|
| compression-rate-avg | Avg compression rate | Producer JMX |
| batch-size-avg | Avg batch size | Producer JMX |
| BytesInPerSec | Broker ingress bytes | Broker JMX |