2015-12-11 18 views
5

ich derzeit eine horizontal skalierbare socket.io Server erschaffe, die wie folgt aussieht:horizontal Skala socket.io mit redis

    LoadBalancer (nginx) 

     Proxy1  Proxy2  Proxy3  Proxy{N} 

BackEnd1 BackEnd2 BackEnd3 BackEnd4 BackEnd{N} 

Meine Frage ist, mit Socket-io redis Modul, kann ich eine Nachricht senden an einen bestimmten Socket, der von einem der Backend-Server mit einem der Proxy-Server verbunden ist, wenn sie alle mit demselben Redis-Server verbunden sind? Wenn ja, wie mache ich das?

Antwort

3

Wenn Sie den Server socket.io skalieren möchten und nginx als Load Balancer verwendet haben, vergessen Sie nicht, sticky load balancing einzurichten, andere werden mit mehreren Servern verbunden, basierend auf Load Balancer die Verbindung zu socket.io Server. Also besser zu verwenden sticky load balancing

Mit dem Redis-Socket-IO-Adapter können Sie Nachricht mit einem oder mehreren socket.io Server mit Hilfe von Redis Pub/Sub implementation senden und empfangen.

Wenn Sie mir sagen, welche Technologie für Proxy und Backend verwendet wird, werde ich Sie mehr Informationen dazu geben.

+0

Alle Server verwenden Node.js. Ich frage nur, wie ich von einem der Backend-Server an einen Client senden kann, vorausgesetzt, sie sind alle mit demselben Redis-Speicher verbunden. –

2

Mit dem socket.io-redisis-Modul teilen sich alle Ihre Backend-Server den gleichen Pool verbundener Benutzer. Sie können von Backend1 ausgeben und wenn ein Client mit Backend4 verbunden ist, wird er die Nachricht erhalten.

Der Schlüssel für diese Arbeit mit Socket.io ist die Verwendung von Sticky-Sitzungen auf Nginx, so dass, sobald ich Client verbindet, es auf dem gleichen Computer bleibt. Dies liegt daran, dass die Art, wie socket.io mit einem WebSocket und mehreren langen Abfragethreads beginnt, alle auf demselben Back-End-Server sein müssen, damit sie ordnungsgemäß funktionieren.

Anstelle von Sticky-Sitzungen können Sie Ihre Client-Verbindungsoptionen ändern, um NUR Websocket zu verwenden. Dadurch werden die Probleme mit mehreren Verbindungen zu mehreren Servern gelöst, da es nur eine Verbindung, den einzelnen Websocket, gibt. Dadurch verliert Ihre App die Möglichkeit, statt WebSockets auf Long-Polling herabzustufen.

+0

Hey danke für die Antwort. Aus irgendeinem Grund funktioniert das immer noch nicht für mich. Kannst du bitte einen Blick auf diesen Thread werfen und mich wissen lassen, wie es am besten weitergeht? http://stackoverflow.com/questions/34325229/socket-io-wont-emit-from-other-server-using-socket-io-emitter –

Verwandte Themen