Zuverlässigkeit des Websocket-Transports (Socket.io-Datenverlust während der erneuten Verbindung)

Gebraucht

NodeJS, Socket.io

Problem

Stellen Sie sich vor, es gibt 2 BenutzerU1 & U2, über Socket.io mit einer App verbunden. Der Algorithmus ist der folgende:

U1 verliert die Internetverbindung vollständig (zB schaltet das Internet aus)U2 sendet eine Nachricht anU1.U1 empfängt die Nachricht noch nicht, da das Internet ausgefallen istServer erkenntU1 Unterbrechung durch Heartbeat-TimeoutU1 verbindet sich wieder mit socket.ioU1 erhält nie die Nachricht vonU2 - Es ist in Schritt 4 verloren, denke ich.Mögliche Erklärung

Ich glaube ich verstehe warum es passiert:

zu Schritt 4Server beendet die Socket-Instanz und die Warteschlange der Nachrichten anU1 auchAußerdem auf Schritt 5U1 undServer Erstellen Sie eine neue Verbindung (diese wird nicht wiederverwendet). Selbst wenn sich die Nachricht noch in der Warteschlange befindet, geht die vorherige Verbindung trotzdem verloren.Brauche Hilfe

Wie kann ich diesen Datenverlust verhindern? Ich muss Hearbeats verwenden, weil ich nicht für immer Leute in der App hänge. Außerdem muss ich noch die Möglichkeit geben, die Verbindung wiederherzustellen, da ich beim Bereitstellen einer neuen Version der App keine Ausfallzeiten haben möchte.

P.S. Das, was ich "Nachricht" nenne, ist nicht nur eine Textnachricht, die ich in der Datenbank speichern kann, sondern eine wertvolle Systemnachricht, deren Zustellung garantiert werden muss, oder eine fehlerhafte Benutzeroberfläche.

Vielen Dank!

Zusatz 1

Ich habe bereits ein Benutzerkontosystem. Darüber hinaus ist meine Bewerbung bereits komplex. Das Hinzufügen von Offline- / Onlinestatus hilft nicht, da ich bereits über solche Dinge verfüge. Das Problem ist anders.

Schauen Sie sich Schritt 2 an. Bei diesem Schritt gehen wir technisch vorkann nicht sagen, ob U1 offline geht, er verliert nur die Verbindung, sagen wir mal für 2 Sekunden, wahrscheinlich wegen schlechtem Internet. U2 sendet ihm also eine Nachricht, aber U1 empfängt sie nicht, weil das Internet für ihn noch nicht funktioniert (Schritt 3). Schritt 4 ist erforderlich, um Offline-Benutzer zu erkennen. Das Timeout beträgt beispielsweise 60 Sekunden. Nach weiteren 10 Sekunden ist die Internetverbindung für U1 hergestellt und er stellt die Verbindung zu socket.io wieder her. Die Nachricht von U2 geht jedoch im Speicher verloren, da auf dem Server U1 die Verbindung durch eine Zeitüberschreitung unterbrochen wurde.

Das ist das Problem, ich werde nicht 100% liefern.

LösungSammle eine Emission (Name und Daten der Emission) in {} user, die durch eine zufällige emitID identifiziert wird. Senden Sie emitBestätigen Sie die Ausgabe auf der Client-Seite (senden Sie die Ausgabe mit emitID an den Server zurück)Wenn bestätigt - Objekt aus {} löschen, das durch emitID identifiziert wurdeWenn der Benutzer wieder verbunden ist - überprüfen Sie {} für diesen Benutzer und wiederholen Sie die Schleife, indem Sie Schritt 1 für jedes Objekt in {} ausführen.

Bei getrennter oder / und verbundener Spülung {} für den Benutzer, falls erforderlich

// Server const pendingEmits = {};

socket.on ('reconnection', () => resendAllPendingLimits); socket.on ('confirm', (emitID) => {delete (pendingEmits [emitID]);});

// Client socket.on ('something', () => {socket.emit ('confirm', emitID);});