Какие важные термины связаны с масштабированием записи (производительностью на запись) в Kafka?

«Какие важные термины связаны с масштабированием записи (производительностью на запись) в Kafka?» — вопрос из категории Потоковая обработка и Kafka, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При проектировании системы с высокой нагрузкой на запись в Kafka я фокусируюсь на следующих ключевых концепциях:

  • Партиционирование (Partitioning): Топик делится на партиции — базовые единицы параллелизма. Запись масштабируется за счет увеличения количества партиций, так как продюсеры могут писать в разные партиции одновременно.
  • Ключ сообщения (Message Key): Определяет, в какую партицию попадет сообщение (через хэширование). Сообщения с одинаковым ключом гарантированно попадают в одну партицию, что важно для порядка. Неравномерное распределение ключей может привести к «перекосу» (скью) нагрузки.
  • Acks (Подтверждения): Настройка acks продюсера (acks=0, 1, или all) напрямую влияет на надежность и пропускную способность. Для максимальной скорости, но с риском потери данных, используется acks=0. Для надежной записи с гарантией — acks=all (что медленнее).
  • Батчинг (Batching): Продюсер накапливает сообщения в память и отправляет их одним пакетом. Параметры linger.ms и batch.size позволяют балансировать между задержкой и пропускной способностью.
  • Сжатие (Compression): Включение сжатия (compression.type=gzip/snappy/lz4) уменьшает объем передаваемых данных и нагрузку на сеть, что может увеличить общую пропускную способность записи.
  • Квота пропускной способности (Throughput Quota): В Kafka можно настроить квоты на скорость записи/чтения для клиентов, чтобы предотвратить исчерпание ресурсов брокера.

Пример конфигурации продюсера для высокой пропускной способности:

Properties props = new Properties();
props.put("bootstrap.servers", "kafka-broker:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "1"); // Баланс скорости и надежности
props.put("linger.ms", 5); // Накопление батчей до 5 мс
props.put("batch.size", 16384); // Размер батча 16 КБ
props.put("compression.type", "lz4"); // Использование сжатия