Потребитель Кафки в группе пропускает разделы - PullRequest
0 голосов
/ 23 января 2020

У меня есть один потребитель, который потребляет топи c. Топи c имеет 6 разделов. Единый потребитель, назначенный на группу. Я опрашиваю, как показано ниже: Consumer.poll(10000) Я выхожу из выборки потребителя, когда не возвращаются никакие записи.

Из документации я считаю, что опрос возвращается пустым, когда нет записей для использования, и длительности 10000 достаточно для восстановления баланса и выборки записей. В большинстве случаев опрос использует записи из всех разделов, но иногда опрос извлекает записи из 3 разделов и возвращает пустые записи без использования 3 других разделов.

Кстати, я использовал клиент 2.0.1 Kafka и версия сервера Kafka: 2.11 - 2.2.0.

У любого есть идея, почему мой потребитель пропускает другие разделы и возвращает пустые записи. Что мне следует сделать, чтобы использовать все разделы.

1 Ответ

0 голосов
/ 23 января 2020

max.poll.records параметр по умолчанию равен 500. Так что иногда возможно не получить все сообщения из всех разделов в топи c одним опросом ().

max.poll.records : максимум количество записей, возвращаемых в одном вызове poll ().

Кстати, наличие только одного потребителя в группе не является подходящим способом использования topi c с разделами. Ваше количество потребителей в группе потребителей должно быть равно количеству разделов в topi c, подписанных в лучших практиках. (Kafka назначает разделы потребителям по умолчанию равномерно) В противном случае вы не можете масштабировать нагрузку по горизонтали, и в этом случае наличие разделов не имеет особого смысла.

Kafka всегда назначает разделы потребителям. Невозможно иметь раздел, который не назначен потребителю. (Если подписано это topi c)

Но в вашем случае, поскольку вы покидаете потребителя, требуется некоторое время (session.timeout.ms), чтобы Kafka считал этого потребителя мертвым. Если вы снова запускаете потребителя, не дожидаясь прохождения session.timeout.ms, то Кафка понимает, что в группе потребителей есть два активных потребителя, и равномерно назначает разделы этому двум потребителям. (например: разделы 0, 1, 2 для потребителя-1 и разделы 3, 4, 5 для потребителя-2) Но после того, как Кафка осознает, что один из потребителей мертв, в группе потребителей начинается перебалансировка, и все разделы назначаются один активный потребитель в группе потребителей.

session.timeout.ms : время ожидания, используемое для обнаружения сбоев клиента при использовании средства управления группой Kafka. Клиент периодически посылает биения, чтобы указать его жизнеспособность брокеру. Если посредник не получил тактовые импульсы до истечения этого тайм-аута сеанса, то брокер удалит этого клиента из группы и инициирует перебалансировку. Обратите внимание, что значение должно находиться в допустимом диапазоне, настроенном в конфигурации посредника для group.min.session.timeout.ms и group.max.session.timeout.ms

Вы можете проверить текущий раздел назначение для вашей группы потребителей с помощью этой команды cli на стороне брокера:

./kafka/bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group yourConsumerGroup
...