应用程序负载平衡器是否支持WebSockets?

ygya80vv  于 2022-11-11  发布在  其他
关注(0)|答案(5)|浏览(269)

我有一个Elastic Beanstalk应用程序,它最初配置为使用经典负载平衡器。我发现这会在通过WebSocket连接时导致错误。因此,我将该应用程序配置为使用应用程序负载平衡器,因为我被告知ALB支持WebSocket。但是,它们似乎不支持:当我试图通过WebSocket连接到我的ALB时,我得到了完全相同的错误。
ALB真的支持WebSocket吗?AWS文档在这一点上是矛盾的。This page说它只支持HTTP和HTTPS。没有设置ALB以支持WebSocket的指南。

8oomwypt

8oomwypt1#

我能够让WebSockets与新的应用程序负载平衡器(ALB)一起工作。
首先,为ALB创建一个新的目标组。此目标组应使用与应用程序相同的端口,并且需要配置运行状况检查。但是,主要区别在于您必须启用粘滞。

接着,将新的监听器规则新增至ALB。此规则必须具有路径,以路由WebSocket设定-- /socket.io。此外,将“目的群组名称”设定为您刚建立的“目的群组”。

我正在为我的服务器使用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
        };
    }
})();
0sgqnhkj

0sgqnhkj2#

ALB支持WebSocket,但如果示例没有至少每隔“空闲超时”秒发送一些数据,负载平衡器可能会关闭连接。

fiei3ece

fiei3ece3#

应用负载平衡器支持WebSocket。但在2017年2月23日之前不支持websocket运行状况检查。他们可能会在以后添加一个选项。当您希望在应用负载平衡器后面使用websocket时,您需要为您的目标组设置HTTP或HTTPS运行状况检查。

来自AWS文档:“请注意,运行状况检查不支持WebSockets。”
参考http://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html

jckbn6z7

jckbn6z74#

ALB(应用程序负载平衡器)支持websockets。您可以检查here
ALB也会根据配置的空闲超时关闭连接。
SnapShot from the above blog

kmbjn2e3

kmbjn2e35#

当我们在客户端使用套接字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']});

这确实解决了我的问题

相关问题