2017-04-04 3 views
0

Wir haben eine Knoteninstanz, die etwa 2500 Client-Socket-Verbindungen hat, alles läuft gut, außer gelegentlich dann etwas passiert mit dem Dienst (Neustart oder Failover-Ereignis in azurblau), wenn die Knoten Instanzen wieder auf und alle Socket-Verbindungen versuchen, die Verbindung wieder herzustellen, kommt der Dienst zum Stillstand und das Protokoll zeigt nur wiederholte Socket-Verbindung/Verbindung getrennt. Selbst wenn wir den Dienst stoppen und starten, geschieht das gleiche, wir senden derzeit ein Paket an unsere On-Premise-Server, um die Chrome-Sitzungen des Benutzers zu beenden, dann funktioniert alles gut, wenn sich die Benutzer wieder anmelden. Wir haben die Clients, die gerade mit 'forceNew' verbinden und nur Web-Sockets erzwingen und nicht das Standard-Long-Polling als das Upgrade. Hat jemand das jemals gesehen oder Ideen?nodeJS wird mit Wiederverbindungen nach Neustart bombardiert

Antwort

0

In Ihrem socket.io-Client-Code können Sie erzwingen, dass die Wiederverbindungen länger verteilt werden. Die beiden Konfigurationsvariablen, die am wichtigsten, hier zu sein scheinen, sind:

reconnectionDelay

Legt fest, wie lange socket.io zunächst warten, bevor ein Reconnect versucht (es von dort wieder aus sollte, wenn der Server ausgefallen ist eine Weile). Sie können dies erhöhen, um es weniger wahrscheinlich zu machen, dass alle versuchen, sich gleichzeitig neu zu verbinden.

randomizationFactor

Dies ist eine Zahl zwischen 0 und 1,0 und standardmäßig auf 0,5. Es bestimmt, wie stark die oben genannte Verzögerung zufällig geändert wird, um zu versuchen, Client-Reconnects zufälliger und nicht alle gleichzeitig zu machen. Sie können diesen Wert erhöhen, um die Zufälligkeit des Neuverbindungstimings zu erhöhen.

Weitere Details finden Sie unter client doc here.

Sie können auch Ihre Serverkonfiguration untersuchen, um zu sehen, ob sie mit einer moderaten Anzahl eingehender Socketanforderungen so skalierbar wie möglich ist. Während niemand erwartet, dass ein Server in der Lage ist, 2500 gleichzeitige Verbindungen gleichzeitig zu bewältigen, sollte der Server in der Lage sein, diese Verbindungsanforderungen in Warteschlange zu stellen und sie so zu bedienen, wie sie Zeit erhält, ohne sofort eine eingehende Verbindung zu versagen, die nicht sofort behandelt werden kann. Es gibt einen wünschenswerten mittleren Grund einiger Anzahl von Verbindungen, die in einer Warteschlange gehalten werden (normalerweise kontrollierbar durch serverseitige TCP-Konfigurationsparameter) und wenn die Warteschlange dann zu groß wird, werden Verbindungen sofort fehlgeschlagen und dann sollte socket.io zurückschalten und es erneut versuchen etwas später. Wenn Sie die oben genannten Variablen anpassen, wird sie vor dem erneuten Versuch länger warten müssen.


Auch ich bin neugierig, warum Sie forceNew verwenden. Das scheint dir nicht zu helfen. Nur WebSockets zu erzwingen (kein anfängliches Polling) ist eine gute Sache.

+0

Wir haben die ForceNew erst kürzlich implementiert, um dies zu beheben. Dies war ein Vorschlag von Microsoft, da wir einen offenen Fall hatten, da unser Knotendienst in Azure gehostet wird. Ich werde Ihren Vorschlag sicher versuchen. – Troy

+0

Wir haben eine Änderung an reconnectionAttempts vorgenommen, sodass der Client die Verbindung nach 5 Versuchen nicht mehr herstellt. Das Problem trat auf, nachdem wir es implementiert hatten, aber das Problem wurde nie behoben. Gestern haben wir die ReconnectionAttempts auf 2 geändert. Ich weiß, Azure verwendet IIS und Iisnode nicht sicher, ob das einen Faktor spielen kann oder nicht. – Troy

Verwandte Themen