2015-03-27 2 views
1

У меня есть тема с 3 разделами на 2 брокера. (Версия Kafka: 0.8.1)Kafka добавляет новых потребителей не балансирует нагрузку

Сообщения навалом добавляются с использованием различных пользовательских указателей (например: FC42B34DD7658503E040970A2C437358) в качестве ключа раздела. (около 10 тыс. сообщений)

При загрузке сообщений у меня есть один работающий потребитель (consumer1), он отлично обрабатывает сообщения.
Затем я начал использовать другой потребитель (consumer2) с тем же идентификатором группы потребителей.

Что я заметил, так это то, что consumer1 перестает обрабатывать сообщения, а consumer2 начинает обрабатывать все сообщения.

Когда я останавливаю потребитель2, потребитель1 принимал и возобновляет обработку сообщений.

Я ожидал, что оба потребителя должны распределить нагрузку.

Любая подсказка, где может возникнуть проблема? Благодарю.

+0

Это потому, что на клиенте я сконфигурировал поток = 3? – heyu

+0

, даже после того, как я изменил поток на 1, еще через некоторое время ~ 20 минут один потребитель прекратил обработку, т. Е. Только один потребитель обрабатывает сообщения за один раз. – heyu

ответ

0

Я не уверен, что происходит у ваших потребителей точно без каких-либо проверок на вашем кластере Zookeeper, но я могу подозревать один возможный сценарий, который ваши продюсеры могут не равномерно распределять сообщения на разделы.

Перегородка принадлежит одному потребителю в одной группе потребителей. Потребитель-владелец называется partition owner, и все сообщения, входящие в раздел, потребляются исключительно его владельцем раздела. (Для получения дополнительной информации см. Consumers в документации Kafka 0.8.1.

Скажем, есть три раздела A, B, C и два пользователя 1 и 2, и производители только отправляют сообщения в раздел B.

Когда есть только потребитель 1, все сообщения разбиения в, потребляемый потребителеме 1.

Когда вы приведете потребитель 2, теперь раздел B назначается для потребителя 2 с помощью алгоритма потребительского балансирующима. Поскольку ваши производители отправляют сообщения только в раздел B, теперь потребитель 2 становится единственным потребителем, который потребляет сообщения.

После того, как вы остановите потребителя 2, раздел B снова будет назначен потребителю 1, и все сообщения будут потребляться потребителем 1.

Вышеупомянутый сценарий - это то, о чем я могу думать. Проверьте, есть ли у вашей реализации производителя проблема с распространением.

+0

Я использовал стратегию разбиения по умолчанию с пользовательским руководством (FC42B34DD7658503E040970A2C437358) в качестве ключа раздела. Для этого типа ключа раздела, любой другой лучший алгоритм разделения для более сбалансированного распределения? Благодарю. – heyu

+0

@heyu Разделитель по умолчанию отправляет сообщения на один и тот же раздел, если ключи одинаковы. Если ключи всегда одинаковы даже в процессе производства, я рекомендую не использовать клавиши сообщений. Если вы отправляете сообщения без ключей, Kafka использует случайный разделитель (https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-Whyisdatanotevenlydistributedamongpartitionswhenapartitioningkeyisnotspecified?). Если вы хотите что-то еще, попробуйте использовать циклический разделитель (http: // qnalist.ком/вопросы/4651371/Кафка-производитель-поведение). – Heejin

+0

@heyu Помните, что случайный разделитель не случайно отправляет сообщения в разделы. Он выбирает раздел и отправляет сообщения на выбранный раздел в течение некоторого периода времени (по умолчанию 10 минут). Для получения дополнительной информации см. Ссылку, которую я вам дал выше. – Heejin

Смежные вопросы