Как kafka балансирует нагрузку разделов?

я столкнулся с вопросом о балансировке нагрузки в Кафке. Итак, я создал тему с 10 разделами и создал 2 потребителя. 10 разделов были разделены и назначены этим потребителям (5 разделов для первого и 5 для второго), и он отлично работает. Иногда первый потребитель работает, иногда второй.

но в какой-то момент мы можем столкнуться с ситуацией, когда, например, второй потребитель получает сообщение, и для этого требуется время (например, 10 минут) сообщение.

Итак, мой вопрос в том, как Кафка решит, в какой раздел хранить сообщение?

Round robin в этом случае я думаю, что это не очень хорошая идея, потому что сообщения в разделах, которые обрабатываются вторым потребителем, не будут обрабатываться до тех пор, пока второй потребитель не закончит длинную работу.

Обновлено!

согласно ответу @Milan Baran, нагрузка сбалансирована на стороне производителя. Но в этом случае, даже если мы предоставьте пользовательский Partitioner реализация, это будет та же проблема, что сообщение, которое было сохранено в разделе, который был назначен потребителю, который выполняет долгосрочную работу, не будет обработано, пока этот потребитель не закончит свою долгосрочную работу.

может быть, есть дополнительный балансировщик нагрузки где-то еще?

3 ответов


решение, какой раздел следует использовать, не зависит от Кафки, но производитель, отправляющий сообщение, должен решить. Посмотрите наhttps://kafka.apache.org/documentation#producerconfigs

вы можете предоставить класс разделителя, чтобы решить, какой раздел выбрать.

разметки.класс!--10-->
Класс разделителя, реализующий разделитель взаимодействие. org.апаш.Кафка.клиенты.производитель.внутренние органы.DefaultPartitioner

существует описание стратегии DefaultPartitioner

/**
 * The default partitioning strategy:
 * <ul>
 * <li>If a partition is specified in the record, use it
 * <li>If no partition is specified but a key is present choose a partition based on a hash of the key
 * <li>If no partition or key is present choose a partition in a round-robin fashion
 */

кажется, что вам нужно-это очереди. один раздел используется несколько потребителей. Каждый потребитель извлекает запись из раздела, обрабатывает ее и извлекает другую. Если одному потребителю требуется слишком много времени для обработки записи, Другие все равно могут получать (разные) записи из раздела.

однако Кафка делает не поддерживаю. Каждый раздел может потребляться только одним потребителем в потребителе группа.

одним словом, вам нужно что-то еще сделать для достижения цели, например RabbitMQ.


спасибо всем за помощь. Но я нашел ответ на свой вопрос. Итак, прежде всего, есть как минимум 3 места, где Кафка балансировку нагрузки:

  1. назначить разделы потребителям "круговой" или " диапазон" используются алгоритмы. Это можно настроить, установив partition.assignment.strategy собственность. По умолчанию используется.
  2. на уровне производителя может быть применена стратегия выбора раздела чтобы сохранить сообщение. Это можно сделать partitioner.class
  3. и ответ на мой вопрос. Если один потребитель обрабатывает сообщение долгое время Кафка думает, что этот потребитель мертв и переназначение разделов между другими потребителями. Так когда долгое время задание выполняется потребителем, ему не назначаются разделы. Когда потребитель заканчивает раздел работы долгого времени будет назначен к это снова. И никаких сообщений не будет.