- Опубликовано
Пакет брать будете? Пакетная отправка сообщений в Kafka
- Автор
- Имя
- Максим | Системный анализ
- Telegram
- Максим | Системный анализ349 подписчиков100 постовКак войти в IT через системный анализ и получить оффер от 200к+. Опыт Senior аналитика из топ-банков. Разборы, практика, собесы, техника мышления аналитика. Бесплатная консультация - в закрепе.
Кратко
Пакет брать будете? Пакетная отправка сообщений в KafkaБатчинг (объединение в пакеты) - один из главных механизмов, обеспечивающих высокую...
Пакет брать будете? Пакетная отправка сообщений в Kafka
Батчинг (объединение в пакеты) - один из главных механизмов, обеспечивающих высокую пропускную способность kafka. Вместо того чтобы отправлять каждое сообщение отдельным сетевым запросом, продюсер накапливает их в памяти и отправляет одним крупным пакетом. Это снижает расходы на сеть, но требует сознательного выбора между задержкой и пропускной способностью.
Батчинг на стороне продюсера:
Самый важный этап. Когда приложение вызывает метод send(), сообщение сначала попадает в record accumulator - буфер в памяти продюсера.
Для каждой партиции топика, в которую предназначены сообщения, поддерживается отдельный батч.
Сообщения группируются по партициям, потому что отправка всегда адресована конкретному лидеру партиции на брокере.
Отправка накопленного пакета происходит при наступлении одного из условий:
✔️ Пакет достиг заданного размера (batch.size).
✔️ Истекло время ожидания (linger.ms).
Только тогда фоновый поток забирает пакет и передает его по сети брокеру.
Батчинг на стороне потребителя:
Потребители тоже читают данные пакетами, что снижает количество запросов к брокеру. А в некоторых сценариях, например для "бездисковых" топиков, брокер сам накапливает сообщения в памяти и сбрасывает их в хранилище.
Настройка батчинга - это всегда компромисс:
🔼 Высокая пропускная способность: увеличение batch.size (например, до 64 КБ-1 МБ) и linger.ms (10-100 мс). Пакеты становятся крупнее, количество сетевых операций сокращается. Идеально для аналитики, логирования, ETL-процессов, где важна скорость обработки больших объемов данных, а не задержка отдельного сообщения.
🔽 Низкая задержка: уменьшение linger.ms (до 0-5 мс) и batch.size. Сообщения отправляются почти сразу, но ценой большего числа сетевых запросов и потенциально меньшей пропускной способности. Это критично для систем реального времени, онлайн-транзакций, чатов.
Грамотный батчинг может увеличить пропускную способность в разы. Но при описании батчинга важно не забывать:
❗️Общий объем памяти, доступный для буферизации всех партиций, ограничен параметром buffer.memory (по умолчанию 32 МБ).
❗️Включение сжатия (например, compression.type=lz4) в паре с батчингом дает синергетический эффект.
Наглядно увидеть эффект от разных настроек системы можно в моем kafka-тренажёре.









