Раздел 26 · Data Engineering

Продюсеры: отправка, ключи, батчинг

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке мы выяснили, что партицию для сообщения выбирает ключ. Но кто именно её выбирает и когда? Это работа продюсера. Сегодня проследим путь одной точки курьера «Гонца» от вызова send до записи в партицию и разберёмся, почему продюсер не отправляет сообщения поштучно.

Почтальон с сумкой

Почтальон не бежит на почту с каждым письмом. Он собирает письма в сумку и идёт, когда сумка полная или когда подошло время обхода. Письма в один район он кладёт в одно отделение сумки, чтобы на почте их не пришлось сортировать заново.

Если писем мало, почтальон всё равно не ждёт до вечера: обход в назначенный час, даже с полупустой сумкой. Если писем много, сумка наполняется раньше, и он уходит, не дожидаясь часа.

Продюсер Kafka устроен так же. Сумка это пачка сообщений, отделение сумки это партиция, а время обхода и размер сумки задают две настройки.

Что внутри сообщения

Продюсер отправляет в топик сообщения. У каждого сообщения пять частей:

ЧастьПример у «Гонца»Зачем
топикcourier-gpsкуда писать
ключcourier-15выбирает партицию
значение{"lat":56.838,"lon":60.597}сами данные
заголовкиcontent-type: application/jsonслужебные пометки, Kafka их не читает
время1791700000000когда сообщение создано

Заголовки похожи на надписи на конверте: «срочно», «хрупкое». На содержимое письма они не влияют.

Kafka хранит ключ и значение как байты. Превращает объект в байты сериализатор: строку он кодирует в UTF-8, объект в JSON. Какой формат выбрать и как договориться о нём с читателями, разберём в уроке про Schema Registry.

Путь сообщения

Вызов send не отправляет сообщение по сети сразу. Внутри продюсера оно проходит четыре шага:

send({ key: 'courier-15', value: '...' })
  1. сериализатор       ключ и значение → байты
  2. партиционер        ключ → партиция 1
  3. накопитель         кладёт сообщение в пачку партиции 1
  4. отправщик          пачка готова → запрос лидеру партиции 1

Второй шаг нам знаком: партиционер берёт хеш ключа по модулю числа партиций. Если ключа нет, он кладёт сообщения в одну партицию, пока не наберёт пачку, а потом переходит к следующей.

Третий и четвёртый шаги это сумка почтальона. Накопитель держит по пачке на каждую партицию. Отдельный поток продюсера забирает готовые пачки и отправляет их брокерам. Отправка одной пачки это один сетевой запрос, сколько бы сообщений в ней ни было.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.