Балансировщик нагрузки приложений поддерживает WebSockets?

У меня есть приложение Elastic Beanstalk, которое изначально было настроено на использование Classic Load Balancer. Я обнаружил, что это вызвало ошибки при подключении через WebSocket. Из-за этого я настроил приложение на использование балансировщика нагрузки приложения, потому что мне сказали, что ALB поддерживают WebSockets. Однако, похоже, что они этого не делают: я получаю точно такую ​​же ошибку при попытке подключиться к моему ALB через WebSocket.

Действительно ли ALB поддерживают WebSocket? Документация AWS по этому вопросу противоречива. На этой странице сказано, что он поддерживает только HTTP и HTTPS. Нет никаких руководств по настройке ALB для поддержки WebSocket.

4 ответа

Мне удалось заставить WebSockets работать с новым Application Load Balancer (ALB).

Сначала создайте новую Target Group для вашего ALB. Эта целевая группа должна использовать тот же порт, что и ваше приложение, и ей необходимо настроить проверку работоспособности. Однако главное отличие заключается в том, что вы должны включить Stickiness.

Добавить целевую группу с липкостью

Затем добавьте новое правило слушателя в свой ALB. Это правило должно иметь Путь для маршрутизации настройки WebSocket - /socket.io. Кроме того, задайте Имя целевой группы для целевой группы, которую вы только что создали.

Добавить правило прослушивания для WebSocket

Я использую Node/Hapi/Socket.io для своего сервера (работает на экземпляре, производном от Amazon Linux AMI). Базовая настройка:

const hapi = require('hapi');
const websocket = require('./WebSocket');

var server = new hapi.Server();
server.connection(config.Application);
websocket.Initialize(server.listener);

где WebSocket.js

var io = null;

module.exports = {

    Initialize: function (http) {

        io = require('socket.io')(http);

        io.on('connection', function (socket) {
            console.log('Websocket ' + socket.id + ' connected.');

            socket.on('disconnect', function () {
                console.log('Websocket ' + socket.id + ' disconnected.');
            });
        });
    }
};

Я использую Angular 1.5x для моего клиента с socket.io-client. Важно настроить параметры клиента WebSocket следующим образом, иначе вы не сможете подключиться.

(function () {

    'use strict';

    angular
        .module('XXXXX', [])
        .run(runHandler);

    runHandler.$inject = ['WebSocketService'];

    function runHandler(WebSocketService) {
       WebSocketService.Initialize();
    }
})();

Сервис WebSocket:

(function () {

    'use strict';

    angular
        .module('XXXXX')
        .factory('WebSocketService', WebSocketService);

    WebSocketService.$inject = [];

    function WebSocketService() {

        var socket = null;

        function initialize() {

            var url = 'http://' + ALB_URL + ':5800';

            socket = io(url, {transports: ['websocket'], upgrade: false});

            socket.on('connect', function () {
                console.log('Socket connected');
            });

            socket.on('disconnect', function () {
                console.log('Socket disconnected');
            });
        }

        return {
            Initialize: initialize
        };
    }
})();

ALB поддерживает Websocket, но подсистема балансировки нагрузки может закрыть соединение, если экземпляр не отправляет некоторые данные, по крайней мере, каждые "секунды простоя".

Балансировщик нагрузки приложения поддерживает websocket. Но нет поддержки проверки работоспособности websocket до 23 февраля 2017 года. Они могут добавить опцию позже. Вам необходимо настроить проверку работоспособности HTTP или HTTPS для вашей целевой группы, если вы хотите использовать веб-сокет за Application Load Balancer.

Из документа AWS: "Обратите внимание, что проверки работоспособности не поддерживают WebSockets".

Ссылка: http://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html

ALB (балансировка нагрузки приложений) поддерживает веб-сокеты. Вы можете проверить здесь https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/ введите описание изображения здесь

также ALB закрывает соединение в зависимости от настроенного времени простоя.

SnapShot из вышеприведенного блога

С точки зрения nodejs. Когда мы используем socket io на стороне клиента и вызываем библиотеку socket.js
следующим образом

const socket = io('domain.com');

то, что я заметил, - это когда я указал Http в качестве протокола, тогда он перенаправил вызов на ws://domain.com, но когда я указал https, он перенаправился на wss://domain.com, и я получал эту ошибку: Ошибка во время WebSocket рукопожатие: Неожиданный код ответа: 400 то, что я сделал, я указал

const socket = io(window.location.origin, {reconnect: true,transports: ['websocket']});

что действительно решило мою проблему

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