Unterschied zwischen Async-Servlet-Long-Poll und Bayeux-Protokoll (Comet)

7

Was ist der Unterschied zwischen einem einfachen Async-Servlet und dem Comet / Bayeux-Protokoll?

Ich versuche eine "Server Push" (oder "Reverse Ajax") Art von Webseite zu implementieren, die Aktualisierungen vom Server erhält, wenn Ereignisse auf dem Server auftreten. Daher muss der Server, auch ohne dass der Client explizit eine Anfrage sendet, Antworten an den jeweiligen Client-Browser senden können.

Ich verstehe, dass der Kometen der Oberbegriff für diese Art von Technologien ist; mit "Bayeux" ist das Protokoll. Aber als ich die Servlet-Spezifikation durchgesehen habe, scheint sogar das 'Async-Servlet' das Gleiche zu erreichen. Ich meine, ich kann mit dem

ein einfaches Servlet definieren %Vor%

Attribut in der web.xml auf true gesetzt; und dieses Servlet wird in der Lage sein, Antworten asynchron an den Client zu senden. Ich kann dann einen jQuery oder ExtJS basierten Ajax Client haben, der einfach ein

macht %Vor%

ruft das Servlet auf. So etwas wie im folgenden Link beschrieben Ссылка

Also meine Frage ist das:

Was ist der Unterschied zwischen einem einfachen Async-Servlet und dem Comet / Bayeux-Protokoll?

Danke

    
Basanth Roy 10.01.2013, 22:41
quelle

1 Antwort

24

Es ist wahr, dass "Comet" der Begriff für diese Technologien ist, aber das Bayeux-Protokoll wird nur von wenigen Implementierungen verwendet. Eine Comet-Technik kann jedes beliebige Protokoll verwenden; Bayeux ist einer von ihnen.

Abgesehen davon gibt es zwei Hauptunterschiede zwischen einer asynchronen Servlet-Lösung und einer Comet + Bayeux-Lösung.

Der erste Unterschied besteht darin, dass die Comet + Bayeux-Lösung unabhängig von dem Protokoll ist, das Bayeux transportiert. Im Projekt CometD gibt es Plug-in-Übertragungen für Clients und Server, die Bayeux verwenden können. Sie können es über HTTP übertragen, wobei Bayeux der Inhalt einer POST-Anfrage ist, Sie können es aber auch mit WebSocket verwenden, wobei Bayeux die Nutzlast der WebSocket-Nachricht ist. Wenn Sie asynchrone Servlets verwenden, können Sie WebSocket nicht einsetzen, das viel effizienter als HTTP.

Der zweite Unterschied besteht darin, dass asynchrone Servlets nur HTTP übertragen und Sie mehr als das benötigen, um entfernte Comet-Clients zu verwalten.

Sie möchten beispielsweise die Clients eindeutig identifizieren, sodass zwei Registerkarten für die gleiche Seite zu zwei verschiedenen Clients führen. Um dies zu tun, müssen Sie der asynchronen Servlet-Anfrage eine "Eigenschaft" hinzufügen, nennen wir sie sessionId .

Als nächstes möchten Sie in der Lage sein, einen Client zu authentifizieren; Nur authentifizierte Clients können eine sessionId erhalten. Um jedoch zwischen ersten Anfragen zur Authentifizierung und anderen bereits authentifizierten Anfragen zu unterscheiden, benötigen Sie eine andere Eigenschaft, sagen wir messageType .

Als Nächstes möchten Sie in der Lage sein, schnelle Verbindungsunterbrechungen aufgrund von Netzwerkverlusten oder anderen Verbindungsproblemen zu melden. Also musst du eine Herzschlaglösung entwickeln, damit du weißt, dass die Verbindung am Leben ist, wenn das Herz schlägt, wenn es nicht schlägt, dass du tot bist, und führe Rettungsaktionen durch.

Als nächstes müssen Sie die Verbindungsfunktionen trennen. Und so weiter.

Sie merken schnell, dass Sie ein weiteres Protokoll über HTTP aufbauen.

An diesem Punkt ist es besser, ein existierendes Protokoll wie Bayeux und bewährte Lösungen wie CometD (das auf Comet-Techniken basiert, die das Bayeux-Protokoll verwenden) wiederzuverwenden, die Ihnen Folgendes bieten:

  • Java- und JavaScript-Client-Bibliotheken mit einfachen, aber leistungsstarken APIs
  • Java-Server-Bibliothek zur Ausführung Ihrer Anwendungslogik, ohne dass Details auf niedriger Ebene wie HTTP oder WebSocket über annotierte Dienste behandelt werden müssen
  • Transport Pluggability, Client und Server
  • Bayeux-Protokoll-Erweiterbarkeit
  • Lazy Nachrichten
  • Clustering
  • Höchstleistung
  • Zukunftssicher: Benutzer von CometD vor dem Aufkommen von WebSocket haben keine Codezeile geändert, um WebSocket zu nutzen - all die Magie wurde in den Bibliotheken implementiert
  • Basierend auf Standards
  • Entwickelt und gewartet von Experten für Webprotokolle
  • Erweiterte Dokumentation
  • Ich kann fortfahren, aber Sie bekommen den Punkt:)

Sie möchten keine Low-Level-Lösung verwenden, die Sie nur mit HTTP verbindet. Sie möchten eine Lösung auf höherer Ebene verwenden, die Ihre Anwendung von der verwendeten Comet-Methode und von dem Protokoll, das Bayeux transportiert, abstrahiert, sodass Ihre Anwendung einmal geschrieben werden kann und zukünftige Technologieverbesserungen genutzt werden können. Als ein Beispiel für Technologieverbesserung funktionierte CometD gut, bevor asynchrone Servlets ins Bild kamen und nun mit dem asynchronen Servlet einfach skalierbarer wurden und damit Ihre Anwendung, ohne dass eine einzelne Zeile in der Anwendung geändert werden musste.

Wenn Sie eine Lösung auf höherer Ebene verwenden, können Sie sich auf Ihre Anwendung konzentrieren und nicht auf die detaillierten Details, wie man ein asynchrones Servlet richtig schreibt (und das ist nicht so einfach, wie man vielleicht denkt).

Die Antwort auf Ihre Frage könnte lauten: Sie benutzen Comet + Bayeux, weil Sie auf der Schulter von Riesen stehen wollen .

    
sbordet 10.01.2013, 23:51
quelle