Как работает round-robin в Kafka
Что проверяют
Понимаете ли вы, как продюсер выбирает партицию и что на самом деле работает по умолчанию. Следом спрашивают про порядок сообщений и про назначение партиций консьюмерам, где round-robin тоже встречается.
Как отвечать
Разведите два места, где встречается это понятие. На стороне продюсера партицию выбирает партиционер:
- сообщение с ключом: партиция считается как хеш ключа (murmur2) по модулю числа партиций. Один ключ всегда попадает в одну партицию, поэтому порядок по ключу сохраняется;
- сообщение без ключа: до Kafka 2.4 это и был round-robin по записям. С 2.4 работает sticky-логика: продюсер пишет в одну партицию, пока не заполнится батч, потом переключается. Батчи крупнее, задержка и нагрузка на брокеры ниже. С Kafka 3.3 встроен uniform sticky партиционер, который учитывает скорость брокеров, а
DefaultPartitionerиUniformStickyPartitionerпомечены устаревшими; RoundRobinPartitioner: настоящий поштучный round-robin, включается явно черезpartitioner.classи игнорирует ключ. У него была известная неравномерность: при создании нового батча партиционер вызывался повторно и счётчик сдвигался.
Если нужно равномерно раскидать сообщения с ключами без своего класса, есть partitioner.ignore.keys=true.
На стороне консьюмеров round-robin это RoundRobinAssignor в partition.assignment.strategy: партиции всех топиков раскладываются по участникам группы по кругу. Альтернативы: RangeAssignor, StickyAssignor и CooperativeStickyAssignor, последний перебалансирует постепенно, не останавливая всю группу. С Kafka 4.0 есть новый протокол групп, где назначение считает брокер.
Где спотыкаются
Говорят, что по умолчанию Kafka раскладывает сообщения по кругу. Уже много версий это не так, и такой ответ выдаёт устаревшее знание.
Включают RoundRobinPartitioner для событий, где важен порядок, например статусов одного заказа. Порядок гарантируется только внутри партиции, и события одного заказа разъедутся.
Путают партиционер продюсера и assignor консьюмеров. Это разные настройки на разных клиентах, и решают они разные задачи.