Konfliktlösung für bidirektionale Synchronisierung

24

Wie verwalten Sie die bidirektionale Synchronisation zwischen einem 'Haupt'-Datenbankserver und vielen' Sekundär'-Servern, insbesondere die Konfliktlösung, vorausgesetzt, eine Verbindung ist nicht immer verfügbar?

Zum Beispiel habe ich eine mobile App, die CoreData als "Datenbank" unter iOS verwendet, und ich möchte Benutzern erlauben, die Inhalte ohne Internetverbindung zu bearbeiten. Gleichzeitig sind diese Informationen auf einer Website verfügbar, mit der die Geräte eine Verbindung herstellen. Was mache ich, wenn die Daten auf den beiden DB-Servern in Konflikt stehen?
(Ich bezeichne CoreData als DB-Server, obwohl mir bewusst ist, dass es etwas anderes ist.)

Gibt es allgemeine Strategien für den Umgang mit solchen Problemen? Dies sind die Optionen , die ich denken kann:
1. Immer die clientseitige Daten mit höherer Priorität verwendet
2. Das gleiche gilt für die serverseitige
3.e Versuchen zur Lösung von Konflikten durch jedes Feld bearbeiten Zeitstempel markiert und unter der neuesten bearbeiten

Obwohl ich mir sicher bin, dass die dritte Option Raum für verheerende Datenkorruption eröffnet.

Ich bin mir bewusst, dass das GAP-Theorem dies betrifft, aber ich möchte nur eine eventuelle Konsistenz, also schließt es dies nicht vollständig aus, oder?

Verwandte Frage: Best-Practice-Muster für die bidirektionale Datensynchronisation . Die zweite Antwort auf diese Frage besagt, dass dies wahrscheinlich nicht möglich ist.

K.Steff
quelle

Antworten:

14

Die übliche Lösung, um zu wissen, "welche Änderung korrekt ist", ist eine Vektoruhr . Sie verfolgen im Wesentlichen die Leistungsindikatoren für jedes Repository, in dem sich die Daten befinden, und lehnen Änderungen ab, wenn sich die Ansicht eines bestimmten Clients zum Status aller anderen von der des Peers unterscheidet, mit dem die Verbindung hergestellt wird.

Die große Frage, die Sie beantworten müssen, ist, wie Sie abgelehnte Speicherungen auflösen. Dies bedeutet im Allgemeinen eine Art Zusammenführungsvorgang.

Beachten Sie, dass Vektoruhren keine Echtzeit-Zeitstempel verwenden. Die Probleme bei der Synchronisation von Echtzeituhren sind mindestens so schwierig wie bei der Synchronisation von Daten.

Parsifal
quelle
1
Schön, das ist, was ich gesucht habe
K.Steff
10

Dies ist das Problem der byzantinischen Generäle , das unlösbar ist. Sie können die Synchronisierung der beiden Server niemals garantieren, wenn Sie nicht garantieren können, dass Sie zu einem späteren Zeitpunkt über eine ausreichende zuverlässige Bandbreite verfügen, um die Synchronisierung auf einmal durchzuführen.

DeadMG
quelle
Ok, aber wie kommen diese Typen zu einem ähnlichen Effekt: Syncpoint-Entwicklung
K.Steff
3
Sie gehen einfach davon aus, dass Sie irgendwann in Zukunft eine zuverlässige Verbindung mit ausreichender Bandbreite haben werden.
DeadMG
1

Ich denke, es gibt keine Standardmethode, jedes System verwendet seine eigenen Richtlinien für die Konfliktlösung.

Ich habe mit zwei Geräten, Computer und Telefon, und Google Spreadsheet einige Simulationen durchgeführt, um zu überprüfen, wie Google Text & Tabellen Konflikte automatisch behandelt. Hier einige Fälle:

Fall 1

  1. Computer und Telefon sind offline
  2. Computer Zelle mit Wert 'Computer' und nach dem Telefon Zelle mit Wert 'Telefon' bearbeiten
  3. Computer werden online
  4. Das Telefon wird online und sowohl der Computer als auch das Telefon zeigen "Telefon" an.

Fall 2

  1. Computer und Telefon sind offline
  2. Computer Zelle mit Wert 'Computer' und nach dem Telefon Zelle mit Wert 'Telefon' bearbeiten
  3. Telefon online werden
  4. Computer werden online und sowohl Computer als auch Telefon zeigen "Computer" an.

Zumindest der Google Text & Tabellen-Server verwendet die zuletzt erhaltenen Daten als höhere Priorität, unabhängig davon, wann sie erstellt wurden (Zeitstempel des Clients). Ich habe auch getestet, ob sie im Hintergrund synchronisiert werden, und anscheinend auch nicht, sodass das Ergebnis der Konfliktlösung für den Benutzer transparent ist.

GIT hingegen verarbeitet Konflikte nicht automatisch, sondern delegiert sie an den letzten Benutzer, der versucht hat, das Repository so zu ändern, wie die Zusammenführung erfolgen soll.

Ich würde den Google Text & Tabellen-Ansatz wählen, wenn es in Ordnung wäre, nur im Vordergrund zu synchronisieren, wobei der Benutzer die Daten visualisiert. Andernfalls kann ein Benutzer überrascht sein, dass, während sein Telefon automatisch mit einem WLAN verbunden ist, eine nicht synchronisierte Änderung an einem Meeting vorgenommen wird, das er nach einer erneuten Bearbeitung auf seinem PC live geschaltet hat.

Ich würde mich für den Client-Zeitstempel-Ansatz entscheiden und die Konflikte mit dem zuletzt bearbeiteten überschreiben, wenn Sie eine Hintergrundsynchronisierung benötigen, dem Client-Zeitstempel vertrauen können und die Kosten für eine unerwünschte Zusammenführung geringer sind als die Kosten für die Aufforderung an den Benutzer, die gewünschte Version auszuwählen behalten.

Ansonsten würde ich mich für den GIT-Ansatz entscheiden, indem ich im nächsten Client ein Popup-Fenster im Vordergrund zeige, in dem der Benutzer gefragt wird, welche Version beibehalten werden soll, oder eine Chance gebe, die Zusammenführung rückgängig zu machen.

Allan Veloso
quelle
1
Ich stimme zu, dass ein Einzelfallansatz der geeignete Weg ist, um hier voranzukommen. Der "beste" Weg (Git-Ansatz) ist nicht immer anwendbar, da Benutzer Änderungen möglicherweise nicht überprüfen / zusammenführen möchten
K.Steff