Завершение соединений WebSocket на AWS EBS за ALB

У кого-нибудь есть подход к изящному прекращению подключений WebSocket к Elastic Beanstalk за балансировщиком нагрузки приложений?

Во время масштабирования экземпляры EC2 завершаются и немедленно сбрасывают свои соединения. Мне интересно, есть ли хороший способ обработать завершение или я могу завершить только экземпляр, который больше не имеет активных соединений.

Каждый клиент WebSocket имеет состояние с помощью магии липких сессий / файлов cookie. Переподключение клиента к другой проблеме - это хорошо, но я хочу избегать этого, когда это возможно.

1 ответ

Решение

Экземпляры EC2 завершаются и немедленно сбрасывают свои соединения. Мне интересно, есть ли хороший способ справиться с прекращением,

Вы можете сделать опыт более изящным для своих пользователей:

Простой подход:

Существует функция "Отключение соединения", когда экземпляр необходимо отключить из-за события масштабирования, он будет ждать в течение заданного времени для завершения существующих соединений, он не будет отправлять новые запросы этому экземпляру и после указанная продолжительность принудительно прервет оставшиеся соединения, если таковые имеются. Таким образом, время может быть установлено дольше, чем указанная вами длительность Cookie-сессии Sticky, а также дольше, чем TTL для WebSocket, который вы настроили из своего приложения, и убедитесь, что приложение повторяет подключение после этой продолжительности.

Как вы используете Elastic Beanstalk. Функция находится в ELB -> Приложение -> Среда -> Конфигурация -> LoadBalancers

Это должно удовлетворить ваши текущие потребности.

Более динамичный (комплексный) подход:

"Изящный способ разорвать эти открытые связи".

"Изящное" завершение может произойти, когда и клиент, и сервер будут уведомлены о предстоящем прекращении соединения из-за события масштабирования, чтобы они могли затем выполнить задачи по уборке дома до того, как соединение будет прервано, то есть экземпляр будет закрыт.

Это зависит от вашего варианта использования, если вы хотите пойти по этому пути. Но, если вам это нужно, вы можете сделать следующее

  1. Когда соединение WebSocket установлено. Клиентскому приложению предоставляется базовый идентификатор экземпляра EC2. (аналог подключения к веб-сокету)

  2. Создайте тревогу наблюдения за облаком для события наблюдения за облаком "Ожидание: ожидание", подробности события здесь

  3. Создайте тему SNS для уведомлений о тревоге в облаке. Уведомление должно иметь идентификатор экземпляра ec2.

  4. И клиентские приложения, и серверные приложения подписываются на эту тему. И когда приходит уведомление, они могут проверить идентификатор экземпляра ec2, чтобы убедиться, что он является хостом соединения WebSocket. Если да, они готовятся к тому, что соединение будет прервано в случае масштабирования.

Как видите, есть более подвижная часть. Но, если это улучшает пользовательский опыт и сценарий использования оправдывает это. Тогда это было бы решением.

Другие вопросы по тегам