Как работает kafka consumer, если потребители больше, чем разделы

#apache-kafka

#апач-кафка #apache-kafka

Вопрос:

Не мог бы кто-нибудь, пожалуйста, объяснить и направить мне ссылку или ресурс, чтобы прочитать о том, как потребители kafka работают в приведенных ниже сценариях.

  1. Одна группа потребителей с 5 потребителями и тема с 3 разделами (как решает кафка )

  2. Одна группа потребителей с 5 потребителями и разделом с 10 разделами (как загружается kafka share)

  3. Две группы потребителей по 1 потребителю в каждой и кластер kafka из 2 серверов, где одна тема разделена между узлами 1 и 2 , как можно избежать дублирования, когда потребители из разных групп подписаны на один раздел.

Возможно, это не лучшая практика при настройке kafka, но мне нужно знать, как она обрабатывается.

Заранее благодарю.

Ответ №1:

Назначать разделы должен не сам Kafka, а один из потребителей. Первый, кто присоединится к группе потребителей, будет избран своего рода «лидером», и мы начнем назначать разделы другим потребителям. Конечно, каждый раз, когда новый потребитель присоединяется к группе, «контроллер» Kafka сообщает об этом лидирующему потребителю, и он запускает перебалансировку, переназначая разделы. То же самое происходит, когда потребитель покидает группу потребителей.

Чтобы подтвердить, что потребитель участвует в этом, стратегия назначения разделов определяется partition.assignment.strategy свойством в конфигурации потребителя. Значение по умолчанию равно RangeAssignor , в то время как другие — RoundRobinAssignor и StickyAssignor . Вы можете узнать больше о том, как они работают здесь:

https://kafka.apache.org/21/javadoc/org/apache/kafka/clients/consumer/RangeAssignor.html
https://kafka.apache.org/21/javadoc/org/apache/kafka/clients/consumer/RoundRobinAssignor.html
https://kafka.apache.org/21/javadoc/org/apache/kafka/clients/consumer/StickyAssignor.html

Сказал, что происходит конкретно в ваших сценариях?

  1. 3 потребителя получат по одному разделу каждый. Остальные 2 будут простаивать.
  2. каждый потребитель получит 2 раздела
  3. Использование разных групп потребителей означает чистый паб / суб, где группы потребителей получают одинаковые сообщения. В вашем случае с 1 темой и 2 разделами (на 2 брокерах) два потребителя, каждый из которых находится в одной группе потребителей, получат одинаковые сообщения из всех 2 разделов. Если потребители являются частью разных групп потребителей, вы не можете избежать дублирования, так работает Kafka.

Комментарии:

1. Спасибо ppatierno за быструю помощь. Действительно, это помогает.

Ответ №2:

Это зависит от partition.assignment.strategy свойства, для которого установлен класс org.apache.kafka.clients.consumer.RangeAssignor по умолчанию. Из документа Java:

Назначающий диапазон работает для каждой темы. Для каждой темы мы размещаем доступные разделы в числовом порядке, а потребителей — в лексикографическом порядке. Затем мы делим количество разделов на общее количество потребителей, чтобы определить количество разделов, которые нужно назначить каждому потребителю. Если он не будет равномерно разделен, то у первых нескольких потребителей будет один дополнительный раздел. Например, предположим, что есть два потребителя C0 и C1, две темы t0 и t1, и каждая тема имеет 3 раздела, в результате чего получаются разделы t0p0, t0p1, t0p2, t1p0, t1p1 и t1p2. Назначение будет следующим: C0: [t0p0, t0p1, t1p0, t1p1] C1: [t0p2, t1p2]

Вы можете разработать свою собственную стратегию, внедрив org.apache.кафка.клиенты.потребитель.внутренности.Разделительный знак. На Medium есть хорошая статья об этом.