Будет ли групповой кординатор лечить мертвого потребителя kafka (0.9), если он не вызывает poll () очень долгое время?

https://www.safaribooksonline.com/library/view/kafka-the-definitive/9781491936153/ch04.html упоминается, что "Пока потребитель отправляет контрольные сообщения через регулярные промежутки времени, предполагается, что он находится в рабочем состоянии и обрабатывает сообщения из своих разделов. , опрос сообщений - это то, что заставляет потребителя отправлять эти контрольные сигналы. Если потребитель перестанет посылать контрольные сигналы на достаточно долгое время, его сеанс истечет по таймауту, и координатор группы сочтет его мертвым и инициирует перебалансировку ".

Аналогичным образом https://kafka.apache.org/090/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html указывает, что «Брокер автоматически обнаруживает неудачные процессы в тестовой группе, используя контрольный сигнал. Механизм. Потребитель будет периодически автоматически проверять связь с кластером, что позволяет кластеру узнать, что он активен. Пока потребитель может это сделать, он считается живым и сохраняет за собой право потреблять данные из назначенных ему разделов. прекращает биение в течение периода времени дольше, чем session.timeout.ms, тогда он будет считаться мертвым, а его разделы будут назначены другому процессу ".

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

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

б) Есть ли другие способы отправки контрольных сообщений координатору группы, чтобы поддерживать сеанс в активном состоянии?

c) Будет ли здесь session.timeout.ms как-то влиять на поддержание активности / активности потребителя?


person Deeps    schedule 06.07.2016    source источник


Ответы (1)


а) Да, если вы не звоните poll() дольше session.timeout.ms, Kafka считает потребителя мертвым.

б) В качестве альтернативы вы можете вызвать poll() во время обработки (т. е. чередование с обработкой), чтобы вызвать сердцебиение (и поиск перед каждым «настоящим» опросом). Также возможно использование дополнительного потока обработки, позволяющего основному потоку регулярно опрашивать на предмет отправки сердцебиения. Однако вам необходимо убедиться, что сбои в потоке обработки обнаруживаются (что сложно сделать правильно)!

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

Проблема, которую вы описываете, на самом деле известна, и поведение потребителей может измениться в будущем. Об этом уже идет дискуссия. См. KIP-62.

Обновить

Начиная с Kafka 0.10.1 у потребителя есть два параметра конфигурации: max.poll.interval.ms и session.timeout.ms. Первый - это максимальное время между двумя последовательными опросами, а второй - это тайм-аут пульса. Такты отправляются в дополнительном потоке и, таким образом, теперь не связаны с вызовом poll(). Таким образом, увеличение max.poll.interval.ms не имеет отрицательного эффекта, заключающегося в том, что отказ всего клиента (отсутствие пульса) не обнаруживается быстро.

person Matthias J. Sax    schedule 07.07.2016
comment
Благодарим за указание на существующий KIP для решения этой проблемы. Принимая ваше предложение b), похоже, что я мог бы создать новый поток после каждого вызова poll () в основном потоке и периодически (используя sleep ()) вызывать свой собственный poll (), начиная с наименьшего смещения, которое основной поток получил из своего недавнего опрос(). Как только основной поток завершит обработку всех своих сообщений из предыдущего опроса (), я могу завершить новый поток. Это кажется хорошим подходом? - person Deeps; 08.07.2016
comment
да. Оба потока должны использовать один и тот же объект / экземпляр потребителя! В противном случае они рассматриваются как два потребителя. Вот почему вам нужно стремиться исправить позицию перед каждым реальным опросом (опрос сердца медведя может изменить позицию потребителя). - person Matthias J. Sax; 08.07.2016
comment
После дальнейшего чтения кажется, что экземпляр потребителя не является многопоточным, поэтому звучит так, как будто должен быть другой способ сохранить жизнь потребителю. - person Deeps; 07.09.2016
comment
Вы правы, это не потокобезопасный (это причина, по которой (b) трудно понять ...). Как объясняется в ответе, вы либо poll регулярно, либо увеличиваете время ожидания. KIP-62 исправит эти проблемы в будущем. У меня нет лучшего совета. Извините. - person Matthias J. Sax; 07.09.2016
comment
Спасибо, Мэтт. Кажется, KI-62 уже выпущен в версии 0.10.1.0, но я нигде не могу найти загрузку для этой версии. Любая идея? - person Deeps; 20.09.2016
comment
0.10.1.0 еще не выпущен, но будет доступен в ближайшие пару недель. - person Matthias J. Sax; 21.09.2016