Питання 22 · Розділ 15

Як працює компресія повідомлень

4. Monitoring compression rate — індикатор ефективності

Мовні версії: English Russian Ukrainian

Рівень Junior

Визначення

Компресія — це стиснення батчів повідомлень для зменшення використання network і disk space.

Без компресії: 1MB батч
З lz4: 300KB батч (70% економії)

Доступні алгоритми

gzip   — найкраще стиснення, повільна швидкість
snappy — середнє стиснення, швидка швидкість
lz4    — хороше стиснення, дуже швидка швидкість
zstd   — відмінне стиснення, середня швидкість

Налаштування

props.put("compression.type", "lz4");
// Варіанти: none, gzip, snappy, lz4, zstd

Навіщо потрібна компресія?

✅ Менше network I/O
✅ Менше disk usage на брокері
✅ Швидша передача повідомлень
✅ Менше cost за network traffic

Рівень Middle

Порівняння алгоритмів

Алгоритм Стиснення Швидкість CPU Usage Рекомендація
gzip Найкраще Повільно Високий Рідко використовується
snappy Середнє Швидко Низький Low latency
lz4 Хороше Дуже швидко Низький Default choice
zstd Відмінне Середньо Середній Max compression

Налаштування компресії

Producer:

props.put("compression.type", "lz4");
// Компресія застосовується до батча цілком

Broker:

# Глобальне налаштування (може бути перевизначене на топику)
compression.type=producer — брокер НЕ перекомпресує повідомлення, а приймає
формат продюсера. Значення uncompressed змусить брокер розпакувати.

Topic:

kafka-configs.sh --alter --topic orders \
  --add-config compression.type=lz4 \
  --bootstrap-server localhost:9092

Compression Ratio

Приклади compression ratio:
  JSON дані: 3:1 - 5:1
  Текст: 4:1 - 10:1
  Бінарні дані: 1.5:1 - 2:1
  Вже стиснуті дані: 1:1 (немає ефекту)

Типові помилки

  1. gzip для high-throughput:
    Високий CPU overhead → bottleneck
    → Затримка обробки
    
  2. Без компресії:
    Великі повідомлення → більше network usage
    → Вище cost, повільніша передача
    
  3. Компресія вже стиснутих даних:
    gzip на gzipped файлах → немає ефекту
    → Wasted CPU
    

Рівень Senior

Internal Implementation

Compression Flow:

1. Продюсер накопичує повідомлення в батч
2. Батч серіалізується
3. Застосовується алгоритм компресії
4. Стиснутий батч відправляється брокеру
5. Брокер зберігає стиснутим
6. Консьюмер отримує стиснутим, розпаковує

Decompression:

Розпаковка відбувається на консьюмері:
- CPU usage на консьюмері
- Прозоро для додатку
- Kafka client library handles automatically

Algorithm Selection

lz4 — default choice:

Переваги:
- Дуже швидка компресія/decompression
- Хороший compression ratio
- Низький CPU usage
- Ідеально для більшості випадків

Use cases:
- General purpose
- High throughput systems
- Low latency requirements

zstd — max compression:

Переваги:
- Найкращий compression ratio
- Налаштовуваний рівень стиснення
- Швидший за gzip

Use cases:
- Економія disk space
- Cross-DC replication (економія bandwidth)
- Довгострокове зберігання

snappy — legacy choice:

Переваги:
- Швидка компресія
- Підтримка в старих клієнтах

Use cases:
- Сумісність зі старими системами
- Low latency з помірним стисненням

Compression Level Tuning

// zstd підтримує налаштування рівня
// 1-22 (за замовчуванням 3)
props.put("compression.type", "zstd");
// В деяких клієнтах:
props.put("zstd.level", "9");  // вище = краще стиснення

Performance Impact

CPU overhead:
  none:  0%
  lz4:   ~5%
  snappy: ~10%
  zstd:  ~15-20%
  gzip:  ~30-40%

Network savings:
  none:  0%
  lz4:   ~50-70%
  snappy: ~40-60%
  zstd:  ~60-80%
  gzip:  ~70-85%

(орієнтовні значення для JSON/text даних; реальні цифри залежать від типу даних
і необхідно тестувати на production workload)

Monitoring

Ключові метрики:

kafka.producer:compression-rate-avg
kafka.producer:compression-time-avg
kafka.consumer:decompression-time-avg
kafka.server:bytes-in-per-sec
kafka.server:bytes-out-per-sec

Alerts:

- Compression rate < 1.2 → investigate
- Compression time > threshold → warning
- CPU usage on brokers > threshold → warning

Best Practices

✅ lz4 за замовчуванням для більшості випадків
✅ zstd для економії disk/bandwidth
✅ Моніторинг CPU usage на брокерах
✅ Compression на батчі (не на повідомленні)
✅ Тестування ratio на production даних

❌ Без компресії для production
❌ gzip для high-throughput систем
❌ Компресія вже стиснутих даних
❌ Без моніторингу compression rate
❌ Ігнорування CPU impact

Архітектурні рішення

  1. lz4 — баланс — найкращий вибір для більшості випадків
  2. zstd — економія — коли disk/bandwidth критичні
  3. Compression на батчі — кращий ratio
  4. Monitoring compression rate — індикатор ефективності

Резюме для Senior

  • lz4 — найкращий баланс для більшості випадків
  • zstd — коли потрібне максимальне стиснення
  • Compression застосовується до батча цілком
  • CPU overhead vs network savings trade-off
  • Monitoring compression rate критичний для efficiency

🎯 Шпаргалка для інтерв’ю

Обов’язково знати:

  • Компресія стискає батчі для зменшення network I/O і disk usage
  • Алгоритми: gzip (найкраще стиснення, повільний), snappy (швидкий), lz4 (баланс), zstd (відмінне стиснення)
  • lz4 — default choice: дуже швидкий, хороший ratio, низький CPU (~5%)
  • Компресія застосовується до батча цілком — більший батч = кращий ratio
  • JSON/text: 3:1 - 5:1 ratio; бінарні: 1.5:1 - 2:1; вже стиснуті: 1:1
  • Продюсер стискає, консьюмер розпаковує прозоро (client library handles)
  • Broker НЕ перекомпресує — приймає формат продюсера

Часті уточнюючі запитання:

  • Який алгоритм обрати? — lz4 для більшості випадків, zstd для економії disk/bandwidth.
  • Де відбувається розпаковка? — На консьюмері, прозоро для додатку.
  • Чи можна стискати вже стиснуті дані? — Можна, але ефекту немає (1:1), wasted CPU.
  • Який overhead у gzip? — ~30-40% CPU, рідко використовується в high-throughput системах.

Червоні прапорці (НЕ говорити):

  • «Брокер перекомпресує повідомлення» — приймає формат продюсера
  • «gzip — найкращий вибір для production» — високий CPU overhead, lz4 краще
  • «Компресія на кожному повідомленні» — на батчі цілком
  • «Компресія безкоштовна» — CPU overhead 5-40% залежно від алгоритму

Пов’язані теми:

  • [[21. Що таке batch в Kafka producer]]
  • [[1. Що таке топiк (topic) в Kafka]]
  • [[3. Як дані розподіляються по партиціях]]