Другой вопрос, который вы цитируете, не говорит о том, что ребалансировки можно избежать при перезапуске. Отсутствие отправки LeaveGroupRequest
позволяет избежать перебалансировки только после остановки приложения. Следовательно, количество перебалансировок сокращается с двух до одного. Конечно, с вашим несколько необычным развертыванием с одним экземпляром вы ничего здесь не получите (на самом деле, это может «навредить» вам ...) .timeout.ms? Мы установили для него довольно большое значение, так как брокеры Kafka находятся в другом центре обработки данных, а сетевые соединения иногда не очень надежны.
Может быть, в зависимости от того, как быстро вы перезапустите приложение. (Более подробная информация ниже.) Может быть, просто попробуйте (ie, установите его на 3 минуты, чтобы по-прежнему было высокое значение для стабильности, и посмотрите, как время перебалансировки упадет до 3 минут?
Это В ответе предлагается уменьшить max.poll.interval.ms, так как это связано с таймаутом перебалансировки. Верно? Я не решаюсь изменить это, так как это может иметь последствия для нормального режима работы нашего приложения.
max.poll.interval.ms
также влияет на время перебалансировки (подробности ниже). Однако значение по умолчанию составляет 30 секунд, поэтому время перебалансировки не должно составлять 5 минут.
Есть упоминание конфигурации group.initial.rebalance.delay.ms, чтобы отложить перебалансировку во время развертывания - но это вызовет задержки также после восстановления из cra sh, не так ли?
Это только применяется к пустым группам потребителей, а значение по умолчанию составляет всего 3 секунды. Так что это не должно повлиять на вас.
Я также наткнулся на KIP-345, цель которого - устранить перебалансировку потребителей для st ati c членство полностью через group.instance.id, что было бы хорошо для нашего случая пользователя, но, похоже, оно еще не доступно для наших брокеров.
Использование stati c членство в группе может быть лучшим выбором. Возможно, стоит обновить ваших брокеров, чтобы получить эту функцию.
Кстати, разница между session.timeout.ms
и max.poll.interval.ms
объясняется в другом вопросе: Разница между session.timeout.ms и max.poll .interval.ms для Kafka 0.10.0.0 и более поздних версий
Как правило, координатор группы на стороне брокера поддерживает список всех участников для каждого «поколения группы». Перебалансировка запускается, если участник активно покидает группу (отправляя LeaveGroupRequest
), истекает время ожидания (через session.timeout.ms
или max.poll.interval.ms
) или новый участник присоединяется к группе. Если происходит перебалансировка, каждый участник получает шанс снова присоединиться к группе, чтобы быть включенным в следующее поколение.
В вашем случае в группе только один участник. Когда вы останавливаете свое приложение, LeaveGroupRequest
не отправляется, и, таким образом, координатор группы удалит этого участника только после того, как session.timeout.ms
пройден.
Если вы перезапустите приложение, он вернется как «новый» участник (с точки зрения координатора группы). Это вызовет отказ, давая возможность всем членам группы снова присоединиться к группе. В вашем случае «старый» экземпляр может все еще находиться в группе, и поэтому перебалансировка будет продвигаться вперед только после того, как координатор группы удалил старого участника из группы. Проблема может заключаться в том, что координатор группы думает, что группа расширяется с одного до двух членов ... (Это то, что я имел в виду выше: если будет отправлено LeaveGroupRequest
, группа станет пустой, когда вы остановите вас. app, и при перезапуске в группе будет только новый член, и перебалансировка сразу же продвинется вперед.) идентифицируется как "старый" экземпляр, и координатору группы не нужно ждать истечения срока действия старого члена группы.