Ich möchte, dass mehrere Benutzer dasselbe Dokument bearbeiten. Das Problem besteht darin, dass ein neuer Benutzer beim Beitritt möglicherweise ein veraltetes Dokument sieht. Wie stelle ich sicher, dass neue Benutzer die neuesten Änderungen erhalten?
Einige Lösungen, an die ich gedacht habe:
Sparen Sie bei jeder Änderung. Ich mag diese Lösung nicht, weil sie die Benutzeroberfläche verlangsamt und die Datenbank belastet.
Wenn ein neuer Benutzer beitritt, lösen Sie das Speichern auf allen anderen Clients aus. Laden Sie das Dokument, nachdem andere Clients es gespeichert haben. Damit kann es immer noch zu Inkonsistenzen kommen.
Alle anderen Vorschläge wären hilfreich.
UPDATE: Nachdem ich mir die vorgeschlagene Lösung, die Google Realtime API, angesehen hatte, stellte ich fest, dass:
Benutzer Ihrer App müssen über Google Drive verfügen und Ihnen Zugriff auf ihr Laufwerk gewähren . Dies könnte bestenfalls einen unangenehmen Ablauf der Benutzeroberfläche darstellen oder verhindern, dass Benutzer ohne Google Drive die Echtzeitfunktion verwenden.
Alle Freigabeeinstellungen, die auf Ihrer Seite vorgenommen werden, müssen für das Google-Dokument repliziert werden.
UPDATE 2: Um das Ziel zu erreichen, habe ich mich für Googles Firebase entschieden
quelle
Antworten:
Google Drive
Wenn Sie versuchen, eine eigene Version von Google Docs zu erstellen, sollten Sie sich die Google Realtime-API ansehen . Google hat dies kürzlich veröffentlicht, um anderen Entwicklern die Verwendung derselben Tools zu ermöglichen, die sie für die Zusammenarbeit in Echtzeit verwendet haben. Auf diese Weise können Sie Zeit bei Ihrer Entwicklung sparen und schneller ein funktionierendes Produkt erhalten.
Sie können die im Dokument enthaltenen Daten problemlos in regelmäßigen Abständen in Ihre Datenbank übertragen oder die Datenbank selbst als "Teilnehmer" des Austauschs verwenden, indem Sie einfach alle Änderungen abhören und protokollieren. Außerdem kann ein Benutzer seine eigenen Datenstrukturen definieren, die dann in der Echtzeit-API verwendet werden können, sodass Sie sie nach Belieben erweitern können.
Nicht von Google Drive
Nach Ihren Recherchen ist Google Drive also keine Option. Das ist in Ordnung, aber es wird schwieriger und funktioniert möglicherweise nicht so gut, je nachdem, wie viel Sie in es stecken.
Hier ist eine allgemeine Strategie, mit der ich dieses Problem lösen würde:
Der Server soll der Kommunikationsmultiplexer sein. Jede Person spricht mit dem Server und der Server sendet diese Informationen an alle anderen. Auf diese Weise hat der Server immer die aktuellste Ansicht des Dokuments.
Suchen Sie einen Algorithmus / ein Modul eines Drittanbieters zur Konfliktlösung. Konfliktlösung ist schwierig und immer noch nicht perfekt. Dies allein könnte den Umfang des Projekts leicht vergrößern, um viel zu groß zu sein. Wenn Sie keinen Algorithmus eines Drittanbieters verwenden können, würde ich vorschlagen, dass Sie nur einem Benutzer erlauben, einen Bereich einer Zeit zu bearbeiten, sodass der Benutzer vor dem Bearbeiten eines Bereichs eine Sperre erhalten muss, oder Sie riskieren, die Arbeit eines anderen Benutzers zu zerstören wird sehr alt, sehr schnell.
Wenn ein neuer Benutzer beitritt, geben Sie ihm das neueste Dokument und streamen Sie die Befehle automatisch an ihn. Der Server hat die aktuellste Ansicht und kann diese daher automatisch austeilen.
Sicherung in der Datenbank in bestimmten Intervallen. Entscheiden Sie, wie oft Sie eine Sicherungskopie erstellen möchten (alle 5 Minuten oder möglicherweise alle 50 Änderungen). Auf diese Weise können Sie die gewünschte Sicherung beibehalten.
Probleme: Dies ist keine perfekte Lösung. Hier sind einige Probleme, mit denen Sie möglicherweise konfrontiert sind.
Der Durchsatz des Servers kann die Leistung beeinträchtigen
Zu viele Leute, die lesen / schreiben, können den Server überlasten
Personen gehen möglicherweise nicht mehr synchron, wenn eine Nachricht verloren geht. Sie sollten daher sicherstellen, dass Sie an regelmäßigen Punkten synchronisieren. Dies bedeutet, dass die gesamte Nachricht erneut gesendet werden muss, was kostspielig sein kann. Andernfalls verfügen die Benutzer möglicherweise nicht über dasselbe Dokument und kennen es nicht.
quelle
Ich würde 1 dauerhafte Kopie des Dokuments auf dem Server empfehlen. Wenn ein Client eine Verbindung zum Server herstellt, geben Sie
UPDATE
diesem Client einen Befehl mit allen Änderungen aus.Aktualisieren Sie WorkFlow
Der Benutzer löst eine Änderung aus -> Client sendet
UPDATE
an Server -> Server sendetUPDATE
an ClientsLebensfähige Auslöser
Implementierung aktualisieren
Ich würde vorschlagen, das Dokument mit einer Reihe von
UPDATE
Befehlen neu erstellen zu können, damit der Server jedes UPDATE speichert. Wenn ein neuer Client eine Verbindung herstellt, kann dem Client eine Reihe von Aktualisierungen gesendet werden, und er selbst kann das anzuzeigende Dokument neu erstellen der Benutzer. Alternativ können Sie auch einenSAVE
separaten Befehl verwenden und UPDATE als temporäre Änderungen verwenden, die fürUNDO
Anforderungen verwendet werden können. SAVE speichert ihn tatsächlich, um ihn erneut zu öffnen, wenn der Server geschlossen wird oder alle Clients die Verbindung trennen.quelle
1) Schauen Sie sich Knockout.js an
Es folgt einem MVVM-Muster und sendet basierend auf Änderungen am Modell automatisch Benachrichtigungen an die Ansicht. Schauen Sie sich zum Beispiel das beobachtbare Array an, um ein wenig mehr Informationen darüber zu erhalten, wie sie das tun.
2) Mischen Sie dies mit SignalR und Sie sollten nun die Möglichkeit haben, Benachrichtigungen an andere Benutzer zu senden, die an dem Dokument arbeiten. Von ihrer Website:
Daher müssen Sie in Knockout.js einige Hooks auf Modellebene haben, um bei jeder Änderung einige SignalR-Aufrufe durchführen zu können. Die anderen Clients erhalten die Benachrichtigung von SignalR und lösen dann eine entsprechende Änderung in ihrer Kopie des Modells aus, die auf ihre Ansicht zurückgesetzt wird.
Es ist eine interessante Kombination der beiden Frameworks, und Sie sollten in der Lage sein, mehr Informationen zu suchen und zu sammeln, um mit den Details umzugehen.
In diesem Beispiel für ein Codeprojekt wird beispielsweise speziell angesprochen,
Co Working UIs and Continuous Clients
was genau das zu sein scheint, was Sie versuchen.Dieser Blog-Beitrag scheint ein Einstiegspunkt in eine Reihe von Blog-Beiträgen zu sein, in denen die Verwendung der beiden Pakete erörtert wird, und stellt dies einem herkömmlichen ASP.NET-Ansatz gegenüber. Kann einige Punkte berücksichtigen, die beim Entwerfen Ihrer Website berücksichtigt werden müssen.
Dieser Blog-Beitrag scheint etwas grundlegender zu sein und bietet die Grundlage für die Kombination der beiden Pakete.
Offenlegung: Ich bin weder mit einem der oben genannten Links verbunden, noch habe ich mich wirklich mit deren Inhalten befasst, um zu sehen, wie solide oder korrekt sie sind.
quelle
Die Lösung ist Operational Transformation (OT). Wenn Sie noch nichts davon gehört haben, ist OT eine Klasse von Algorithmen, die Echtzeit-Parallelität an mehreren Standorten durchführen. OT ist wie Echtzeit-Git. Es funktioniert mit jeder Verzögerung (von Null bis zu einem längeren Urlaub). Damit können Benutzer gleichzeitig Live-Änderungen mit geringer Bandbreite vornehmen. OT bietet Ihnen eine eventuelle Konsistenz zwischen mehreren Benutzern ohne erneute Versuche, ohne Fehler und ohne dass Daten überschrieben werden.
Die Implementierung von OT ist jedoch eine schwierige und zeitaufwändige Aufgabe. Vielleicht möchten Sie eine externe Bibliothek wie http://sharejs.org/ verwenden .
quelle
Dies hängt hauptsächlich von der Art Ihrer Dokumente und der Zusammenarbeit Ihrer Benutzer ab.
Ich würde jedoch:
Vorteile:
Nachteile:
quelle
Im Wesentlichen fragen Sie, wie Sie mit dem gemeinsamen veränderlichen Zustand umgehen sollen. Sparen ist der einfache Teil; Aber wie gehen Sie mit mehreren Personen um, die gleichzeitig dasselbe bearbeiten? Sie möchten, dass alle Benutzer dasselbe Dokument anzeigen und gleichzeitig die Bearbeitungen in Echtzeit synchronisieren.
Wie Sie wahrscheinlich gesehen haben, ist es ein schweres Problem! Es gibt einige pragmatische Lösungen:
quelle