Поддерживает ли платформа балансировки нагрузки поддержку WebSockets?

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

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

Ответ 1

Мне удалось заставить WebSockets работать с новым балансировщиком нагрузки приложений (ALB).

Сначала создайте новую целевую группу для вас 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
        };
    }
})();

Ответ 2

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

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

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

Ответ 3

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