Зачем нужен ключ партиционирования в Kafka
Что проверяют
Понимаете ли вы, что порядок сообщений гарантирован только внутри партиции, и что ключ это способ этим управлять.
Как отвечать
Тема разбита на партиции, и ключ определяет, в какую из них попадёт сообщение: обычно берётся хеш ключа по модулю числа партиций. Одинаковый ключ означает одну и ту же партицию, а значит гарантированный порядок для этой сущности.
Отсюда два главных смысла:
- порядок там, где он нужен: события одного заказа или пользователя отправляют с его идентификатором в ключе, и потребитель обработает их в том порядке, в каком они произошли. Глобального порядка по всей теме не бывает вовсе;
- распределение нагрузки: разные ключи расходятся по партициям, и их читают разные потребители одной группы параллельно.
Без ключа сообщения распределяются по партициям сами (в новых версиях с накоплением в пакеты по одной партиции), порядок между ними не гарантирован.
Что стоит добавить, это отличает практический ответ:
- горячие ключи: если у одного значения ключа непропорционально много событий, его партиция становится узким местом. Тогда ключ дробят, например добавляя к нему остаток от идентификатора;
- число партиций менять больно: при увеличении соответствие ключей партициям меняется, и порядок для существующих ключей ломается. Число закладывают с запасом;
- параллелизм ограничен партициями: потребителей в группе не может быть больше, чем партиций, лишние будут простаивать;
- ключ участвует и в уплотнении темы: при включённом сжатии по ключу остаётся последнее значение для каждого ключа.
Где спотыкаются
Ждут глобального порядка сообщений в теме.
Ставят ключом случайное значение и теряют порядок для сущности.
Увеличивают число партиций на живой теме и получают перемешанные события для существующих ключей.