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.
Antworten:
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.
quelle
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.
quelle
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
Fall 2
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.
quelle