В прошлом уроке мы выяснили, что партицию для сообщения выбирает ключ. Но кто именно её выбирает и когда? Это работа продюсера. Сегодня проследим путь одной точки курьера «Гонца» от вызова 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.