it-swarm.com.de

Konfliktlösung für die bidirektionale Synchronisierung

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?

Ich habe beispielsweise eine mobile App, die CoreData als "Datenbank" unter iOS verwendet, und ich möchte Benutzern ermöglichen, 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/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 mir einfallen:
1. Verwenden Sie die clientseitigen Daten immer mit höherer Priorität
2. Gleiches gilt für die Serverseite
3. Versuchen Sie, Konflikte zu lösen, indem Sie den Bearbeitungszeitstempel jedes Felds markieren und die letzte Bearbeitung vornehmen

Obwohl ich sicher bin, dass die dritte Option Raum für verheerende Datenkorruption bietet.

Ich bin mir bewusst, dass das CAP-Theorem dies betrifft, aber ich möchte nur eine eventuelle Konsistenz, damit dies nicht vollständig ausgeschlossen wird, 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.

24
K.Steff

Die übliche Lösung, um zu wissen, "welche Änderung richtig ist", ist eine Vektoruhr . Sie verfolgen im Wesentlichen die Zähler 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 er eine Verbindung herstellt.

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 Vektortakte keine Echtzeit-Zeitstempel verwenden. Die Probleme beim Synchronisieren von Echtzeituhren sind mindestens so schwierig wie das Synchronisieren von Daten.

14
parsifal

Dies ist das Problem Byzantinische Generäle , das nicht lösbar ist. Sie können niemals garantiert die beiden Server synchronisieren, wenn Sie nicht garantieren können, dass zu einem späteren Zeitpunkt Sie über eine ausreichende zuverlässige Bandbreite verfügen, um die Synchronisation all-in durchzuführen ein Versuch.

10
DeadMG

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

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

Fall 1

  1. Computer und Telefon sind offline
  2. Computer-Bearbeitungszelle mit dem Wert "Computer" und nach dem Telefon Bearbeitungszelle mit dem Wert "Telefon"
  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-Bearbeitungszelle mit dem Wert "Computer" und nach dem Telefon Bearbeitungszelle mit dem Wert "Telefon"
  3. Telefon online werden
  4. Computer werden online und sowohl Computer als auch Telefon zeigen "Computer" an.

Zumindest der Google Text & Tabellen-Server verwendet also die zuletzt empfangenen 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 nicht, sodass das Ergebnis der Konfliktlösung für den Benutzer transparent ist.

GIT hingegen behandelt Konflikte nicht automatisch, sondern delegiert stattdessen an den letzten Benutzer, der versucht hat, das Repository zu ändern, wie die Zusammenführung durchgeführt werden soll.

Ich würde mich für den Google Text & Tabellen-Ansatz entscheiden, wenn es in Ordnung ist, 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 einer Besprechung erfolgt, die 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.

Andernfalls würde ich mich für den GIT-Ansatz entscheiden, indem im nächsten Client im Vordergrund ein Popup angezeigt wird, in dem der Benutzer aufgefordert wird, die beizubehaltende Version auszuwählen oder die Möglichkeit zum Zurücksetzen der Zusammenführung zu geben.

1
Allan Veloso