Назад | Перейти на главную страницу

Развертывание службы приложений Azure не закрывает соединение Node.js WebSockets

Задний план

У меня проблемы с развертыванием службы приложений Azure. Я использую VSTS для развертывания с помощью функции развертывания службы приложений Azure. Я развертываю контейнер Docker в слот службы приложений Linux. В контейнере Docker запущен сервер Node.js WebSocket, который при подключении отправляет сообщения с текущей версией приложения на основе текстового файла, созданного как часть сборки.

В моем клиентском приложении я настроил его на получение версии приложения с сервера WebSocket при поступлении сообщения. Его роль определяет, соответствует ли версия сервера WebSocket версии клиента. Когда соединение WebSocket потеряно из-за перезапуска или развертывания, клиентское приложение будет пытаться повторно подключиться, пока сервер WebSocket не вернется в режим онлайн.

Проблема

Похоже, что развертывания создают 2 версии службы приложений. Один является оригиналом, а другой - последним развертыванием. Если у меня открыто окно браузера, он должен заметить, что произошло развертывание, и уведомить меня об изменении версии приложения. Похоже, это случается спорадически.

Единственный способ убедиться, что клиентское приложение замечает изменение версии приложения, - это вручную перезапустить службу приложения через портал Azure или обновить окно браузера. В противном случае браузер не запустит WebSocket. onclose или вызовет его через 2-40 минут. В то время как меня устраивает 2 минуты, меня не устраивает все, что больше 5.

Тесты

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

Когда я выполняю развертывание в VSTS отдельно, соединение WebSocket закрывается случайным образом, но это действительно происходит в течение этих 2-40 минут.

Я попытался настроить выпуск VSTS для перезапуска службы приложений после развертывания, но тогда только несколько браузеров заметили закрытие соединения WebSocket.

В другом выпуске VSTS мне пришлось перезапустить службу приложений перед развертыванием. Это сработало только для 50% развертываний. Остальное не сработает.

Я также попытался настроить выпуск VSTS, чтобы остановить службу приложения, развернуть изменение, а затем запустить его снова. Вероятность обновления развернутой версии составила около 80%.

Вопрос

Как я могу гарантировать, что после развертывания в службе приложений Azure предыдущее работающее соединение WebSocket отключится немедленно, а не через какое-то неопределенное время позже?