3 Stimmen

Welche Bibliotheken oder Plattformen sollte ich verwenden, um Webanwendungen zu erstellen, die eine asynchrone Datensynchronisierung zwischen Clients in Echtzeit ermöglichen?

Dies ist weniger eine Frage mit einer einfachen, praktischen Antwort als vielmehr eine Frage zur Förderung der Diskussion über das Thema Echtzeit-Datenaustausch.

Ich möchte mit einem Beispiel beginnen:

Google Wave ist im Kern eine asynchrone Echtzeit-Datensynchronisationsmaschine. Wave unterstützt (oder plant, dies zu tun) die gleichzeitige (Echtzeit-) Zusammenarbeit an Dokumenten, die unverbundene (Offline-) Bearbeitung von Dokumenten, die Lösung von Konflikten, den Verlauf und die Wiedergabe von Dokumenten mit Zuordnung und die Serverföderation.

Ein zentraler Bestandteil von Wave ist die Operational Transformation Engine: http://www.waveprotocol.org/whitepapers/operational-transform

Die OT-Engine verwaltet den Zustand der Dokumente. Änderungen zwischen den Clients werden zusammengeführt, und jeder Client hat zu jeder Zeit eine vernünftige und konsistente Ansicht des Dokuments; das endgültige Dokument ist schließlich zwischen allen verbundenen Clients konsistent.

Meine Frage ist: Ist dieses System abstrakt oder allgemein genug, um als Bibliothek oder generisches Framework verwendet werden, auf denen Web-Anwendungen, die Echtzeit, asynchrone Zustand in jedem Client synchronisieren zu bauen?

Wird das Wave-Protokoll von aktuellen Webanwendungen (außer dem Google-Client) direkt verwendet? Wäre es sinnvoll, es direkt für die allgemeine Zustandssynchronisation in einer Webanwendung zu verwenden?

Welche anderen vorhandenen Bibliotheken oder Frameworks würden Sie bei der Entwicklung einer solchen Webanwendung verwenden?

Wie viel Code in einer solchen Anwendung könnte Domänen-spezifische Logik im Vergleich zu generischen Zustand Synchronisation Logik sein? Oder anders ausgedrückt: Wie durchlässig könnten die Abstraktionen der Zustandssynchronisierung sein?

Kommentare und Diskussionen sind willkommen!

1voto

Joe Hildebrand Punkte 9915

Jack Moffitt's Buch " Professionelle XMPP-Programmierung mit JavaScript und jQuery " gibt die Antwort auf genau diese Frage, einschließlich der Bits für Operational Transform.

1voto

Daniel Paull Punkte 6667

Was die OT-Implementierungen angeht, so ist Wave wirklich verwässert und kann das Versprechen von OT, über das man in der Literatur liest, nicht einlösen - und kann es auch nicht. Da es auf dem Jupiter-Kollaborationssystem basiert, ist es auf eine Client/Server-Netztopologie beschränkt. Google hat außerdem die OT-Algorithmen von Jupiter dahingehend verändert, dass die Anzahl der Operationen, die von einem bestimmten Client "im Gange" sind, auf eine einzige beschränkt ist - dies schadet der Interaktivität zwischen den Clients erheblich.

Wie "allgemein" ist Wave? Soweit ich mich an den Code erinnere, scheint er ziemlich an das Wave-Datenmodell gebunden zu sein - Blips, Annotationen usw. Daher erwarte ich, dass es schwierig wäre, ihn ohne größere Änderungen auf andere Datenmodelle anzuwenden.

Darüber hinaus würde ich mir Sorgen um die Skalierbarkeit und Robustheit eines auf Wave basierenden Systems machen. Beispielsweise kann nur ein einziger Server Operationen auf einer bestimmten Wave abwickeln, und es ist nicht klar, wie man eine Failover-Unterstützung implementieren kann, da jedes Rollback des Servers eine ziemliche Katastrophe darstellt, die dazu führt, dass alle Clients ihre Waves (einschließlich ausstehender Operationen) wegwerfen.

Wave befindet sich aktiv in der Entwicklung, so dass sich die Dinge mit der Zeit verbessern werden.

Es gibt nicht viele Alternativen zu Wave. Wie bereits in meinem Antwort auf diese Frage Ich verwende Ceda für die OT-basierte Synchronisierung. In Ceda gibt es kein Problem mit "undichter Abstraktion" - es kann OT zur Synchronisierung beliebiger Datenstrukturen verwenden - Ihre Anwendung definiert das Schema.

0voto

Drew Punkte 1944

HTTP wurde entwickelt, um Anrufe zu bearbeiten, die vom Client an den Server gerichtet werden, aber dies ist ein Problem, bei dem man Push-Technologie . Ich bin Webentwickler, würde also die Komet .

Der Browser macht eine Ajax-ähnliche Anfrage an den Server, die offen bleibt offen gehalten wird, bis der Server neue Daten zu Daten an den Browser sendet, die dann in einer Browser in einer vollständigen Antwort gesendet werden. Der Browser initiiert eine neue lange Polling-Anfrage, um die folgenden nachfolgende Ereignisse zu erhalten.

Sie können Webanwendungen im Stil von Comet mit einem Webentwicklungs-Framework namens Lift erstellen. (Es ist in einer Programmiersprache namens Scala geschrieben, die sich zu Java-Bytecode kompilieren lässt, was bedeutet, dass Sie es auf einem Java Application Server ausführen können).

Interessant ist auch HTML5, das eine Funktion namens Web-Sockets die Comet überflüssig machen könnten.

0voto

Julien Genestoux Punkte 28348

Sie können dies mit folgenden Methoden erreichen PubSubHubbub und ich denke, es ist ziemlich einfach. So funktioniert es: beide Systeme müssen RSS/Atom-Feeds haben, die die Daten darstellen, oder zumindest Ereignisse zu den Daten "Objekt an Url XYZ erstellt"... usw.

Vergewissern Sie sich dann, dass beide Feeds PubSubHubbub-aktiviert sind, d. h., dass sie Abonnenten benachrichtigen können, wenn sie ihre Inhalte aktualisieren.

Abonnieren Sie jede Komponente für die Feeds der anderen Komponenten.

Implementieren Sie, was bei der Benachrichtigung passiert: Herunterladen der Datei, Aktualisieren von Daten in einer Datenbank ... was immer Sie wollen.

Der große Vorteil dabei ist, dass es stützt sich nur auf Dinge, die "bekannt" sind : HTTP, ATOM.

Dieser Blogbeitrag gibt ein Beispiel mit sozialen Daten, aber das kann auch für jede andere Art von Daten gelten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X