Продолжаем серию постов про Кафку.
✉️ Структура сообщения
Сообщение может содержать:
✅ Заголовки — это метаданные в формате ключ-значение. Кафка автоматически добавляет несколько заголовков по-умолчанию (например,
TOPIC, PARTITION, TIMESTAMP), но мы тоже можем добавить свои данные в заголовки для передачи какой-то дополнительной информации.✅ Ключ — это необязательное поле, которое нужно для следующих целей:
➡️ на основе ключа определяется, в какую партицию топика записывать сообщение
➡️ если топик работает в режиме COMPACT, то сообщения с одинаковым ключом будут схлопнуты в одно, самое последнее
➡️ ключ может нести дополнительную информацию
✅ Значение — сами данные, которые передаются. Например, сообщение о событии в формате JSON.
🔍 Определение партиции
➡️ Если ключа нет, то партиция определяется случайным образом, но переключение осуществляется не для каждого сообщения без ключа, а по пакетам: наполняется пакет сообщений, отправляемый в одну партицию, затем следующий пакет для следующей партиции и т.д.
➡️ Если ключ есть, то по-умолчанию Kafka вычисляет хэш ключа и на основании значения хэша определяет партицию для сообщения. Таким образом, все сообщения с одинаковым ключом будут отправляться в одну партицию. Это важно, так как Кафка обеспечивает порядок сообщений только в рамках партиции.
Например, мы отправляем сообщения о действиях пользователей. Выберем ключом userId.
Допустим, количество партиций = 3. Тогда:
hash("user123") % 3 → номер партиции
Все сообщения с userId = "user123" будут отправлены в одну и ту же партицию.
Но если мы увеличим число партиций, например, до 10, тогда:
hash("user123") % 10 → другой номер партиции
После увеличения количества партиций старые сообщения с userId = "user123" останутся в одной партиции, а новые могут попасть уже в другую.
➡️ Своя логика определения партиции
Кафка позволяет написать собственную логику определения партиции.
➡️ Прямое указание партиции
При отправке сообщения в продюсере можно явно задать номер партиции.
На практике последние два варианта не встречала, кажется, что это может пригодиться только для особых случаев.
Продолжение ⬇️
