Происходит ли изменение баланса при добавлении нового многопоточного потребителя в группу - PullRequest
0 голосов
/ 24 февраля 2019

Предположим, что существует только одна тема с 20 разделами и одна группа потребителей только с одним экземпляром потребителя, который потребляет из этой темы.

Если этот экземпляр потребителя имеет 20 потоков, после перебалансировки Kafka назначит каждый разделк одному потоку, и это идеально (один поток к одному разделу)

Но на этом этапе;что произойдет, если к этой группе потребителей добавится еще один экземпляр потребителя с 20 потоками?

Полагаю, варианты будут такими:

1 - перебалансировка не произойдет, а второй потребитель останется в режиме ожиданиягосударство.(Поскольку 20 потоков уже достаточно для 20 разделов)

2 - происходит перебалансировка, и 10 разделов назначаются первому потребителю, а остальные 10 разделов назначаются второму потребителю.(10 потоков для каждого потребителя будут простаивать)

На самом деле второй вариант более идеален, я думаю.Потому что мы разделили работу, добавив еще один экземпляр.

Так какой сценарий произойдет в этой ситуации?Может ли Кафка с этим справиться гладко?Или добавление другого экземпляра - просто трата?

Редактировать: я использовал слово "экземпляр" в качестве экземпляра микросервиса, а не экземпляр KafkaConsumer.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Способ назначения разделов темы зависит от PartitionAssignor, который используется лидером группы потребителей.Первый потребитель из группы, которая присоединяется к группе, становится лидером.Если новый потребитель присоединяется к уже запущенной группе, Потребитель Leader на основе его PartitionAssignor назначает разделы конкретному потребителю из группы.

Вы можете установить PartitionAssignor, используя partition.assignment.strategy.Значение по умолчанию org.apache.kafka.clients.consumer.RangeAssignor.Если вы хотите изменить стратегию назначения для своей группы, вы можете использовать другую или реализовать собственную.

Если вы перейдете к javadoc из RangeAssignor https://kafka.apache.org/10/javadoc/org/apache/kafka/clients/consumer/RangeAssignor.html,, вы можете найти следующее:

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

В вашем случае (RangeAssignor) вы не знаетеесли новые темы будут простаивать или нет.Это зависит от идентификаторов потребителей, которые он получает, напр.1-й поток в новый экземпляр может быть свободен, но 2-й может начать обработку данных.

Обновление в соответствии с новой информацией в вопросе

0 голосов
/ 24 февраля 2019

Добавление другого потребителя Kafka здесь бесполезно.Все потоки во втором потребителе будут бездействовать.
Один раздел может быть назначен только одному потребителю.Хотя обратное неверно.Один потребитель может читать данные из n-разделов.
Хотя я бы не сказал, что добавлять второго потребителя - пустая трата времени.Ваш второй потребитель будет действовать как HA.В случае смерти вашего первого потребительского приложения второе потребительское приложение начнет получать данные от Kafka.

...