Что такое ключ партиционирования в Kafka
Что проверяют
Понимаете ли вы, что ключ определяет не только распределение сообщений, но и единственную гарантию порядка, которую даёт брокер, и насколько легко эту гарантию потерять.
Как отвечать
Продюсер считает хеш от сериализованного ключа и берёт остаток от числа партиций топика. Значит, сообщения с одинаковым ключом попадают в одну партицию, а порядок гарантирован только внутри партиции. Отсюда правило выбора: ключом становится то, внутри чего нужна последовательность, обычно идентификатор заказа, клиента или другого агрегата.
producer.send(new ProducerRecord<>(topic, order.getCustomerId(), payload));Без ключа сообщения раскладываются пачками: продюсер держится одной партиции, пока набирается батч, затем переключается на другую. Это не перебор по кругу на каждое сообщение и не случайный выбор, и это заметно на размере батчей.
Чем ответ усиливают: число партиций задаёт потолок параллелизма для группы потребителей, порядок при повторной отправке сохраняется только с идемпотентным продюсером, а равномерность нагрузки на потребителей полностью определяется распределением ключей.
Где спотыкаются
Обещают порядок в пределах топика. Его там нет, он есть в партиции. Если порядок нужен для всего потока, придётся жить с одной партицией и потерять параллелизм, а чаще оказывается, что требуется порядок внутри сущности.
Забывают, что добавление партиций переопределяет соответствие ключей: старые и новые записи одного клиента разъедутся, и последовательность разорвётся на границе изменения. Поэтому число партиций закладывают с запасом или переходят на свой партиционер.
Берут ключ с перекосом: регион, тип события, редкий признак. Одна партиция собирает большую часть трафика, её потребитель отстаёт, остальные простаивают. Лечится обогащением ключа дополнительной частью так, чтобы нужная группировка сохранилась.