2009-08-24 3 views
4

Ich mache Comet Chat mit Erlang. Ich verwende nur eine Verbindung (Long-Polling) für den Nachrichtentransport. Aber wie Sie wissen, kann die Verbindung für lange Abfragen nicht ständig verbunden bleiben. Jedes Mal, wenn eine neue Nachricht ankommt oder das Zeitlimit erreicht, wird sie unterbrochen und dann erneut mit dem Server verbunden. Wenn eine Nachricht gesendet wird, bevor die Verbindung wieder hergestellt wird, ist es ein Problem, die Integrität des Chats beizubehalten.Ein Nachrichtenwarteschlangenmodell in Erlang (Comet Chat)?

Und auch, wenn ein Benutzer mehr als ein Fenster mit Comet-Chat öffnet, müssen alle Chat-Nachrichten synchronisiert werden, was bedeutet, dass ein Benutzer viele Long-Polling-Verbindungen haben kann. Daher ist es schwierig, jede Nachricht pünktlich zu erhalten.

Sollte ich eine Nachrichtenwarteschlange für jede Verbindung erstellen? Oder was könnte man sonst noch besser lösen?

+0

Viele Browser sind so konfiguriert, dass höchstens 2 Verbindungen pro Server aktiv sind. Dies ist ein guter Grund, einen einzigen langen Kommunikationskanal zu verwenden, den alle Abonnements durchlaufen. – Christian

Antwort

1

Für mich scheint der einfachste Weg, eine Prozess/Nachrichtenwarteschlange pro Benutzer mit dem Chat verbunden zu haben (sogar mehr als ein Chat-Fenster haben). Dann verfolgen Sie den Zeitstempel der letzten Nachricht in der Chatfenster-Anwendung und fragen Sie nach dem Zeitstempel nach Nachrichten. Message Queue Prozess sollte Nachrichten nur für eine angemessene Zeitspanne halten. In diesem Szenario ist die Verbindung zum Client vollständig. In einem anderen Szenario können Sie einige harte Beats vom Server senden, aber es scheint weniger zuverlässig für mich. Es löst das Problem nicht aus anderen Grund der Trennung als Timeout. Es gibt viele Varianten serverseitiger Warteschlangen als eine Warteschlange pro Client, pro Benutzer, pro Chatroom, pro ...

+0

Danke für Ihre Antwort. Und diesen Weg benutze ich jetzt auch. Nur ein kleines Problem: verzögerte Nachrichten können erst gesendet werden, wenn die lang pollende Verbindung das nächste Mal aufgebaut wird (oder mit einer neuen kommenden Nachricht), so dass es eine kleine Latenz gibt. –

+0

Sie können auch Heartbeat-Nachrichten verwenden, um Verbindungsunterbrechungen zu vermeiden, aber nicht auf Konsistenz. –