Wie funktioniert der Adapter unter der Haube?

8

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 :

startet %Vor%

Zwei Fragen:

  1. In den Dokumenten erwähnen sie zwei weitere Argumente: pubClient und subClient . Sollte ich sie liefern? Was ist der Unterschied?
  2. Wie verhält sich der io.adapter? Wenn beispielsweise Benutzer A mit Server A und Benutzer B mit Server B verbunden ist und sie miteinander "sprechen" möchten. Was ist unter der Haube?

Danke.

    
Aharon 24.09.2014, 10:41
quelle

2 Antworten

1
  1. 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.

  2. 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.

Nopik 06.05.2015 21:11
quelle
0

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

    
Squivo 11.06.2015 20:39
quelle