Das erste, was Sie entscheiden müssen, ist eine allgemeine Richtlinie darüber, welche Seite bei widersprüchlichen Änderungen als "maßgeblich" angesehen wird.
Dh: Angenommen, Datensatz Nr. 125 wird am 5. Januar um 22 Uhr auf dem Server geändert, und derselbe Datensatz wird am 5. Januar um 23 Uhr auf einem der Telefone (nennen wir es Client A) geändert. Die letzte Synchronisierung fand am 3. Januar statt. Dann verbindet sich der Benutzer beispielsweise am 8. Januar erneut.
Das Erkennen, was geändert werden muss, ist "einfach" in dem Sinne, dass sowohl der Client als auch der Server das Datum der letzten Synchronisierung kennen. Daher muss alles, was seit der letzten Synchronisierung erstellt oder aktualisiert wurde (siehe unten für weitere Informationen), abgeglichen werden.
Angenommen, der einzige geänderte Datensatz ist # 125. Sie entscheiden entweder, dass einer der beiden automatisch "gewinnt" und den anderen überschreibt, oder Sie müssen eine Abstimmungsphase unterstützen, in der ein Benutzer entscheiden kann, welche Version (Server oder Client) die richtige ist, und die andere überschreibt.
Diese Entscheidung ist äußerst wichtig und Sie müssen die "Rolle" der Kunden abwägen. Insbesondere, wenn nicht nur zwischen Client und Server ein potenzieller Konflikt besteht, sondern auch, wenn verschiedene Clients dieselben Datensätze ändern können.
[Unter der Annahme, dass # 125 von einem zweiten Client (Client B) geändert werden kann, besteht die Möglichkeit, dass Client B, der noch nicht synchronisiert wurde, eine weitere Version desselben Datensatzes bereitstellt, wodurch die vorherige Konfliktlösung in Frage gestellt wird.]
In Bezug auf den obigen Punkt " erstellt oder aktualisiert " ... wie können Sie einen Datensatz ordnungsgemäß identifizieren, wenn er von einem der Clients stammt (vorausgesetzt, dies ist in Ihrer Problemdomäne sinnvoll)? Angenommen, Ihre App verwaltet eine Liste von Geschäftskontakten. Wenn Client A angibt, dass Sie einen neu erstellten John Smith hinzufügen müssen, und der Server einen John Smith hat, der gestern von Client D erstellt wurde ... erstellen Sie zwei Datensätze, weil Sie nicht sicher sein können, dass es sich nicht um unterschiedliche Personen handelt? Bitten Sie den Benutzer, diesen Konflikt ebenfalls zu lösen?
Haben Kunden "Eigentum" an einer Teilmenge von Daten? Dh wenn Client B als "Autorität" für Daten für Bereich 5 eingerichtet ist, kann Client A Datensätze für Bereich 5 ändern / erstellen oder nicht? (Dies würde die Lösung von Konflikten erleichtern, könnte sich jedoch für Ihre Situation als nicht durchführbar erweisen.)
Zusammenfassend sind die Hauptprobleme:
- Definieren von "Identität" unter Berücksichtigung der Tatsache, dass getrennte Clients möglicherweise nicht auf den Server zugegriffen haben, bevor ein neuer Datensatz erstellt wurde.
- Die vorherige Situation, unabhängig davon, wie ausgefeilt die Lösung ist, kann zu Datenverdopplungen führen. Sie müssen daher vorhersehen, wie diese regelmäßig gelöst werden können und wie Sie die Kunden darüber informieren können, dass das, was sie als "Datensatz Nr. 675" betrachten, tatsächlich mit / ersetzt durch Datensatz Nr. 543
- Entscheiden Sie, ob Konflikte durch Fiat (z. B. "Die Serverversion übertrifft immer die des Clients, wenn die erstere seit der letzten Synchronisierung aktualisiert wurde") oder durch manuelles Eingreifen gelöst werden
- Im Falle von Fiat , insbesondere wenn Sie entscheiden, dass der Client Vorrang hat, müssen Sie auch darauf achten, wie Sie mit anderen, noch nicht synchronisierten Clients umgehen, bei denen möglicherweise weitere Änderungen vorgenommen werden.
- Die vorherigen Elemente berücksichtigen nicht die Granularität Ihrer Daten (um die Beschreibung zu vereinfachen). Es genügt zu sagen, dass Sie, anstatt wie in meinem Beispiel auf der Ebene "Aufzeichnen" zu argumentieren, möglicherweise besser geeignet sind, Änderungen auf Feldebene aufzuzeichnen. Oder um an einer Reihe von Datensätzen (z. B. Personendatensatz + Adressdatensatz + Kontaktdatensatz) gleichzeitig zu arbeiten und deren Aggregat als eine Art "Metadatensatz" zu behandeln.
Literaturverzeichnis:
Mehr dazu natürlich auf Wikipedia .
Ein einfacher Synchronisationsalgorithmus des Autors von Vdirsyncer
OBJC-Artikel zur Datensynchronisation
SyncML®: Synchronisieren und Verwalten Ihrer mobilen Daten (Buch über O'Reilly Safari)
Konfliktfreie replizierte Datentypen
Optimistische Replikation YASUSHI SAITO (HP Laboratories) und MARC SHAPIRO (Microsoft Research Ltd.) - ACM Computing Surveys, Vol. 3, No. V, Nr. N, 3 2005.
Alexander Traud, Jürgen Nagler-Ihlein, Frank Kargl und Michael Weber. 2008. Zyklische Datensynchronisation durch Wiederverwendung von SyncML. In Proceedings der 9. Internationalen Konferenz über Mobile Data Management (MDM '08). IEEE Computer Society, Washington, DC, USA, 165-172. DOI = 10.1109 / MDM.2008.10 http://dx.doi.org/10.1109/MDM.2008.10
Lam, F., Lam, N. und Wong, R. 2002. Effiziente Synchronisation für mobile XML-Daten. In den Proceedings der elften internationalen Konferenz über Informations- und Wissensmanagement (McLean, Virginia, USA, 4. - 9. November 2002). CIKM '02. ACM, New York, NY, 153-160. DOI = http://doi.acm.org/10.1145/584792.584820
Cunha, PR und Maibaum, TS 1981. Resource & Equil; abstrakter Datentyp + Synchronisation - Eine Methode zur nachrichtenorientierten Programmierung -. In Proceedings der 5. internationalen Konferenz über Software Engineering (San Diego, Kalifornien, USA, 9. - 12. März 1981). Internationale Konferenz für Software Engineering. IEEE Press, Piscataway, NJ, 263-272.
(Die letzten drei stammen aus der digitalen ACM-Bibliothek, keine Ahnung, ob Sie Mitglied sind oder ob Sie diese über andere Kanäle erhalten können).
Von der Dr.Dobbs- Website:
- Erstellen von Apps mit SQL Server CE und SQL RDA von Bill Wagner, 19. Mai 2004 (Best Practices zum Entwerfen einer Anwendung für den Desktop- und mobilen PC - Windows / .NET)
Von arxiv.org:
- Ein konfliktfreier replizierter JSON-Datentyp - das Dokument beschreibt eine JSON-CRDT-Implementierung (Konfliktfreie replizierte Datentypen - CRDTs - sind eine Familie von Datenstrukturen, die gleichzeitige Änderungen unterstützen und die Konvergenz solcher gleichzeitiger Aktualisierungen gewährleisten).