Ich arbeite an 1-1 Chat-Room-Anwendungen mit node.js + express + socket.io. Ich folge dem Artikel: Socket.IO - Räume und Namespaces
Im Artikel wird gezeigt, wie man io.adapter
mit dem Modul socket.io-redis
:
pubClient
und subClient
. Sollte ich sie liefern? Was ist der Unterschied? Danke.
Sie müssen keinen eigenen pubClient / subClient übergeben. Wenn Sie Host / Port übergeben, werden sie für Sie erstellt. Wenn Sie sie jedoch aus irgendeinem Grund selbst erstellen möchten (z. B. wenn Sie Zeitlimits für erneute Verbindungen optimieren möchten), erstellen Sie diese 2 Clients und übergeben sie an den Adapter.
Der Adapter sendet alle intern aus. Also, es gibt Ihnen die Cluster-Funktion. Z.B. Angenommen, Sie haben eine Chat-Anwendung und Sie haben 3 Knoten.js-Server hinter dem Lastenausgleich (also teilen sie sich eine einzelne URL). Nehmen wir außerdem an, dass 6 verschiedene Browser eine Verbindung zur Load-Balancer-URL herstellen und diese an 3 separate node.js-Prozesse, 2 Benutzer pro node.js-Server weitergeleitet werden. Wenn Client 1 eine Nachricht sendet, wird node.js # 1 etwas wie io.to('chatroom').emit('msg from user #1')
tun. Ohne Adapter erhalten beide Server # 1-Benutzer die emit, aber nicht die restlichen 4 Benutzer. Wenn Sie jedoch Adapter verwenden, erhalten die verbleibenden node.js # 2 und node.js # 3 Informationen, die ausgegeben wurden, und geben identische Ausgaben an ihre Clients aus - und alle 6 Benutzer erhalten eine erste Nachricht.
Ich habe mit dem gleichen Problem gekämpft, aber ich habe eine Antwort gefunden, die zumindest in meinen ersten Testphasen für mich zu funktionieren scheint.
Ich habe eine Cluster-Anwendung, die 8 Instanzen mit den Express-, Cluster-, socket.io-, socket.io-redisis- und NOT sticky-Sitzungen ausführt - & gt; denn klebrig zu sein schien eine Menge bizarrer Bugs zu verursachen.
Was meiner Meinung nach in der socket.io-Dokumentation fehlt, ist folgendes:
io.adapter(redis({ host: 'localhost', port: 6379 }));
unterstützt nur Web-Sockets (zumindest unterstützt es keine langen Abfragen). Daher muss der Client angeben, dass nur Websockets verfügbar sind. Sobald ich das getan hatte, konnte ich es in Gang bringen. Also auf der Seite client habe ich {transports: ['websockets']} zum Socket-Konstruktor hinzugefügt ... statt dessen ...
var socketio = io.connect( window.location.origin );
verwende dies
var socketio = io.connect( window.location.origin , {transports:['websocket']} );
Ich konnte keine weitere Dokumentation von socket.io finden, um meine Theorie zu unterstützen, aber ich fügte hinzu, dass es funktioniert hat.
Ich habe dieses großartige Chat-Beispiel, das nicht funktionierte, gegabelt und es funktionierte hier: Ссылка also gibt es endlich ein funktionierendes Beispiel online: D
Tags und Links node.js websocket socket.io express cluster-computing