web-dev-qa-db-fra.com

Un équilibreur de charge d'application prend-il en charge WebSockets?

J'ai une application Elastic Beanstalk qui a été configurée à l'origine pour utiliser un équilibreur de charge classique. J'ai constaté que cela provoquait des erreurs lors de la connexion via WebSocket. À cause de cela, j'ai configuré l'application pour qu'elle utilise plutôt un équilibreur de charge d'application, car on m'a dit que les ALB prennent en charge WebSockets. Cependant, il semble que ce n’est pas le cas: j’obtiens exactement la même erreur lorsque je tente de me connecter à mon ALB via WebSocket.

Les ALB prennent-ils réellement en charge WebSocket? La documentation AWS est contradictoire à ce sujet. Cette page indique qu'elle ne prend en charge que HTTP et HTTPS. Il n'existe aucun guide pour configurer un ALB pour prendre en charge WebSocket.

15
jameshfisher

J'ai réussi à faire fonctionner WebSockets avec le nouvel Application Load Balancer (ALB).

Tout d’abord, créez un nouveau groupe cible pour votre ALB. Ce groupe cible doit utiliser le même port que votre application et doit faire configurer des vérifications de l'état. Cependant, la principale différence est que vous devez activer le paramètre Adhésivité.

Add Target Group with Stickiness

Ensuite, ajoutez une nouvelle règle d'écoute à votre ALB. Cette règle doit avoir un chemin pour router la configuration WebSocket - /socket.io. Définissez également le nom du groupe cible sur le groupe cible que vous venez de créer.

Add Listen rule for WebSocket

J'utilise Node/Hapi/Socket.io pour mon serveur (fonctionnant sur une instance dérivée de l'AMI Amazon Linux). La configuration de base est:

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

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

où WebSocket.js est

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.');
            });
        });
    }
};

J'utilise Angular 1.5x pour mon client, avec socket.io-client. Il est important de configurer les options du client WebSocket comme suit, sinon vous ne pourrez pas vous connecter.

(function () {

    'use strict';

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

    runHandler.$inject = ['WebSocketService'];

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

Le service 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
        };
    }
})();
27
programmerj

L'équilibreur de charge d'application prend en charge Websocket. Mais aucun support pour le bilan de santé de websocket jusqu'au 23 février 2017. Ils peuvent ajouter une option plus tard. Vous devez configurer une vérification de l'état HTTP ou HTTPS pour votre groupe cible lorsque vous souhaitez utiliser un WebSocket derrière Application Load Balancer.

Extrait du document AWS: "Notez que les contrôles de l'intégrité ne prennent pas en charge WebSockets." 

Référence: http://docs.aws.Amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html

1
Bijohn Vincent

ALB prend en charge Websocket, mais l'équilibreur de charge peut fermer la connexion si l'instance n'envoie pas de données au moins toutes les "secondes d'inactivité".

0
Namtrh

ALB (Equilibreur de charge d'application) prend en charge les websockets. vous pouvez vérifier ici https://aws.Amazon.com/blogs/aws/new-aws-application-load-balancer/entrez la description de l'image ici

aLB ferme également la connexion en fonction du délai d'inactivité configuré.

SnapShot du blog ci-dessus

0
saurav omar