Was sind die Vor- und Nachteile der verschiedenen Kometenarchitekturen?

Ich kann mit Lift’s Comet Architecture sprechen, die von Novell ausgewählt wurde, um ihr Pulse-Produkt mit Strom zu versorgen, nachdem sie eine Reihe verschiedener Technologien evaluiert hatten.

Die Comet-Implementierung von Lift verwendet eine einzelne HTTP-Verbindung, um Änderungen an einer beliebigen Anzahl von Komponenten auf der Seite abzufragen. Jede Komponente hat eine Versionsnummer. Die lange Abfrage enthält die Versionsnummer und die Komponenten-GUID. Auf der Serverseite wird ein Listener an alle GUIDs angehängt, die in den langen Abfrageanforderungen aufgeführt sind. Wenn eine der Komponenten eine höhere Versionsnummer hat (oder die Versionsnummer während des Zeitraums der langen Abfrage zunimmt), werden die Deltas (ein Satz von JavaScript, der die Änderung von jeder Version beschreibt) an den Client gesendet. Die Deltas werden angewendet und die Versionsnummer auf dem Client wird auf die höchste Versionsnummer für den Änderungssatz festgelegt.

Lift integriert Long Polling in die Sitzungsverwaltung. Wenn also während eines langen Abrufs eine zweite Anfrage unter derselben URL eingeht, wird der lange Abruf abgebrochen, um einen Verbindungsabbruch zu vermeiden (die meisten Browser haben maximal 2 HTTP-Verbindungen pro benanntem Server). Lift unterstützt auch DNS-Wildcard-Server für lange Abfrageanforderungen, sodass jede Registerkarte im Browser lange Abfragen für einen anderen DNS-Wildcard-Server durchführen kann. Dadurch werden Probleme mit dem Verbindungsabbau vermieden.

Lift erkennt dynamisch den Container, in dem das Servlet läuft, und auf Jetty 6 & 7 und (bald) Glassfish verwendet Lift die “Continuations” -Implementierung der Plattform, um die Verwendung eines Threads während der langen Umfrage zu vermeiden.

Das JavaScript von Lift kann auf jQuery und YUI (und auch auf Prototype / Scriptaculous) sitzen. Der aktuelle Polling-Code enthält das Zurücksetzen bei Verbindungsfehlern und andere “sinnvolle” Methoden zum Behandeln von vorübergehenden Verbindungsfehlern.

Ich habe mir Atmosphere und CometD (beide JVM-orientierte Comet-Technologien) angesehen. Weder hatten (zu der Zeit, als ich sie evaluierte) Unterstützung für mehrere Komponenten pro Seite noch Vermeidung von Verbindungsabbrüchen.

Es hängt wirklich davon ab, was Sie von Ihrem Comet-Server (Programmierserver) erhalten möchten. Ich kann keinen konkreten Vergleich zwischen Comet-Servern erstellen, aber ich kann meine Meinung dazu abgeben, wonach ich suchen soll.

Wenn die Bereitstellung von Daten durch Echtzeitsysteme von Bedeutung ist, wählen Sie eine Comet-Lösung, die einen Transportmechanismus mit geringer Latenz verwendet. Umfragen sind hier nicht die beste Lösung. Die beste Lösung ist ein Transport, der eine Verbindung zwischen dem Client (normalerweise dem Webbrowser) und dem Server aufrechterhält. Dies bedeutet, dass sobald dem Server ein neues Datenelement zur Verfügung steht, dieses auf den verbundenen Client übertragen werden kann. Wenn es sich bei dem Transport um eine Abfragelösung handelt, gibt es Lücken zwischen den Abfrageintervallen, in denen Daten veraltet sind.

Gute Comet-Lösungen werden meiner Meinung nach eine intelligente Verbindungsstrategie haben.

  1. Versuchen Sie, eine Verbindung mit WebSockets herzustellen, da dies in Bezug auf Verbindungsaufwand und Socket-Ressourcen der effizienteste Verbindungstyp ist, da nur eine einzige Socket-Verbindung verwendet wird.
  2. Versuchen Sie, eine HTTP-Streaming-Verbindung zwischen dem Client und dem Server herzustellen. Dies verwendet zwei HTTP-Verbindungen. Bei der ersten handelt es sich um eine dauerhafte Verbindung, die eine echte Datenübertragung in Echtzeit ermöglicht, und bei der zweiten handelt es sich um das Senden von Befehlen an den Server, z. B. Abonnementanforderungen.
  3. Greifen Sie auf die am wenigsten effiziente Option von HTTP Long-Polling zurück, um auf dem Server nach Updates zu suchen.

Das 2-Verbindungslimit ist ein Problem in älteren Browsern und kann eine Überlegung sein. Die meiner Meinung nach einfachste Lösung besteht darin, einfach mehrere DNS-Einträge zu erstellen, die letztendlich auf denselben Server verweisen. Eine gute Comet-Architektur ermöglicht die Definition einer Lastausgleichs- und Failover-Verbindungsstrategie, mit der Probleme mit Verbindungsbeschränkungen einfach umgangen werden können.

Eine Überlegung ist jetzt, ob die Comet-Clients domänenübergreifende Verbindungen unterstützen. In der Vergangenheit war dies in JavaScript nicht möglich, aber CORS (Cross Origin Resource Sharing) hat dies möglich und sicher gemacht. Dies reduziert die Notwendigkeit, Ihren eigenen Server in Ihrer eigenen Domain zu hosten und sich mit DNS-Einträgen herumzuschlagen.

Die Sitzungsverwaltung kann sehr nützlich sein, wenn nach doppelten Sitzungen gesucht werden soll. Wenn eine Verbindung getrennt und dann wieder hergestellt wird und eine Sitzung an der Stelle fortgesetzt werden kann, an der sie getrennt wurde, kann ein echter Mehrwert erzielt werden. Das bedeutet, dass bereits getätigte Abonnements nicht erneut ausgestellt werden müssen. Der Client fängt einfach wieder an, Updates für den Kanal / das Thema zu erhalten, den / das er zuvor abonniert hat.

Andere Dinge, die ich auf den ersten Blick bedenken sollte, sind:

  • Mehrwert bei Client-Technologien wie Wiederverbindung, Abonnieren mehrerer Kanäle / Themen in einem API-Aufruf, konfigurierbares Failover
  • Anzahl gleichzeitiger Verbindungen, die der Server effizient verarbeiten kann. Je mehr, desto besser.
  • Unterstützung für verschiedene Arten der Übermittlung von Daten an den Server, z. B. API-Punkte wie REST
  • Clustering-Unterstützung: Die Möglichkeit, Server zu gruppieren, um Daten gemeinsam zu nutzen und eine horizontale Skalierung zu ermöglichen
  • Wie Daten auf dem Server strukturiert sind, kann je nach Ihren Anforderungen ebenfalls sehr wichtig sein. Sind Sie mit großen XML-Blobs (yuck) zufrieden oder möchten Sie Kanäle / Themen abonnieren, die sich für eine effiziente Bereitstellung eignen? Ich würde mich für Letzteres als Best Practice entscheiden und es sogar vorziehen, wenn eine Comet-Architektur mich dazu zwingt, über die Struktur meiner Daten nachzudenken.