Разница между session.timeout.ms и max.poll.interval.ms для Кафки - PullRequest
1 голос
/ 04 февраля 2020

AFAIK, max.poll.interval.ms введен в Кафке 0.10.1. Однако до сих пор неясно, когда мы можем использовать как session.timeout.ms, так и max.poll.interval.ms. Рассмотрим вариант использования, который поток пульса не отвечает, но мой поток обработки, поскольку он имеет более высокое значение, все еще обрабатывает запись. Но поскольку поток сердцебиения не работает, то после пересечения session.timeout.ms, что именно происходит. Потому что в PO C я заметил, что перебалансирование потребителя не произойдет, пока не достигнет max.poll.interval.ms. Так что для меня session.timeout.ms кажется излишним. Подобный вопрос опубликован, но не отвечает на этот вопрос.

1 Ответ

0 голосов
/ 04 февраля 2020

session.timeout.ms используется для обнаружения сбоев потребителей с помощью механизма сердцебиения. Поток пульса потребителя должен отправить брокеру пульс до истечения времени session.timeout.ms. В противном случае Kafka считает потребителя умершим, и происходит перебалансировка.

heartbeat.interval.ms: Ожидаемое время между пульсами для координатора потребителя при использовании средств управления группой Kafka. Пульс используется для обеспечения того, чтобы сеанс потребителя оставался активным, и для облегчения перебалансировки, когда новые потребители присоединяются или покидают группу.

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

Опрос - это еще один механизм проверки работоспособности потребителей. Ожидается, что потребитель вызовет метод poll () без истечения срока действия max.poll.interval.ms. Если это время истекает (обычно длительный процесс приводит к возникновению этой проблемы), то снова потребитель считается мертвым и срабатывает перебалансировка.

max.poll.interval.ms: Максимальная задержка между вызовы poll () при использовании управления группами потребителей. Это накладывает верхнюю границу на количество времени, в течение которого потребитель может бездействовать до получения большего количества записей. Если poll () не вызывается до истечения этого тайм-аута, то считается, что потребитель потерпел неудачу, и группа будет перебалансирована, чтобы переназначить разделы другому участнику.

Другой важный момент заключается в том, что (из версия 0.10.1.0):

rebalance.timeout = max.poll.interval.ms

Поскольку мы даем клиенту максимум max.poll.interval.ms для обработки пакета записей, это также максимальное время, по истечении которого потребитель может Ожидается, что вы присоединитесь к группе в худшем случае. Поэтому мы предлагаем установить таймаут перебаланса в клиенте Java на то же значение, настроенное с помощью max.poll.interval.ms. Когда начинается перебалансировка, фоновый поток продолжает посылать сердцебиения. Потребитель не присоединится к группе, пока не завершится обработка и пользователь не вызовет poll (). С точки зрения координатора, потребитель не будет удален из группы, пока либо 1) не истечет время ожидания его сеанса без получения тактового импульса, либо 2) не истечет время ожидания перебаланса.

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

Во время перебалансировки вы все еще можете обработать сообщение, которое у вас уже есть, но не можете зафиксировать, и получить CommitFailedException с этим сообщением:

Фиксация не может быть завершена, поскольку группа уже перебалансировал и назначил разделы другому участнику. Это означает, что время между последующими вызовами poll () было больше, чем настроенный max.poll.interval.ms, что обычно означает, что опрос l oop тратит слишком много времени на обработку сообщений. Вы можете решить эту проблему, увеличив тайм-аут сеанса или уменьшив максимальный размер пакетов, возвращаемых в poll () с max.poll.records.

Для получения дополнительной информации вы можете проверить this .

...