6

Ich arbeite an der Synchronisierung zweier Geschäftsobjekte zwischen einem iPhone und einer Website mit einer XML-basierten Nutzlast und würde gerne einige Ideen für eine optimale Routine erbitten. obwohlObjekte zwischen zwei verschiedenen Systemen synchronisieren, beste Vorgehensweise?

Die Natur dieser Frage ziemlich allgemein ist, und ich kann es, die Business-Objekte zwischen einer Web-Einheit und einem Client (Desktop, Mobiltelefon, etc.) müssen anwendbar auf eine Vielzahl von unterschiedlichen Systemen sehen synchronisieren

Die Geschäftsobjekte können auf beiden Seiten bearbeitet, gelöscht und aktualisiert werden. Beide Seiten können das Objekt lokal speichern, aber die Synchronisierung wird nur auf der iPhone-Seite für die getrennte Anzeige initiiert. Alle Objekte haben den Zeitstempel updated_at und created_at und werden von einem RDBMS auf beiden Seiten unterstützt (SQLite auf der iPhone-Seite und MySQL im Web ... wieder denke ich, dass dies nicht wichtig ist) und das Telefon zeichnet das letzte Mal auf Synchronisierung wurde versucht. Ansonsten werden (im Moment) keine weiteren Daten gespeichert.

Welchen Algorithmus würden Sie verwenden, um Netzwerk-Chatter zwischen den Systemen für die Synchronisierung zu minimieren? Wie würden Sie mit Löschungen umgehen, wenn "Soft-Löschungen" keine Option sind? Welche Datenmodelländerungen würden Sie hinzufügen, um dies zu erleichtern?

Antwort

11

Der einfachste Ansatz: Übertragen Sie bei der Synchronisierung alle Datensätze where updated_at >= @last_sync_at. Nachteil: Dieser Ansatz toleriert den Taktversatz nicht sehr gut.

Es ist wahrscheinlich sicherer, eine Versionsnummernspalte beizubehalten, die bei jeder Aktualisierung einer Zeile inkrementiert wird (so dass der Zeitversatz den Synchronisierungsprozess nicht beeinträchtigt) und eine letzte synchronisierte Versionsnummer (damit möglicherweise widersprüchliche Änderungen möglich sind) identifiziert werden). Um dies bandbreiteneffizient zu gestalten, bewahren Sie in jeder Datenbank der letzten Version, die an jeden Replikationspartner gesendet wird, einen Cache auf, so dass nur geänderte Zeilen übertragen werden müssen. Wenn dies eine Sterntopologie sein soll, können die Blätter ein vereinfachtes Schema verwenden, in dem die letzte synchronisierte Version in jeder Tabelle gespeichert ist.

Um die Synchronisierung von Löschvorgängen zu unterstützen, sind einige Soft-Löschungen erforderlich. Dies kann jedoch in Form eines Tombstone-Datensatzes erfolgen, der nur den Schlüssel der gelöschten Zeile enthält. Tombstones können nur dann sicher gelöscht werden, wenn Sie sicher sind, dass alle Replikate sie verarbeitet haben. Anderenfalls ist es möglich, dass eine verstreute Replik einen Datensatz wiederbelebt, von dem Sie glauben, dass er gelöscht wurde.

+0

Vielen Dank für Ihr Feedback. Ich denke, das Problem, das Sie bezüglich der Zeitverschiebung angesprochen haben, ist wichtig. Meine erste Hoffnung ist, dass zwischen NTP auf dem Server und den eigenen Zeitsynchronisierungsdiensten des iPhone/Touch mit den Carrier/Computer - Zeitverschiebungsproblemen gemildert werden. Ist diese Annahme zu gefährlich? – hyuan

+0

Es ist in vielerlei Hinsicht zerbrechlich - zum Beispiel kann eine Uhr, die rückwärts zurückgesetzt wird, auch verpasste Aktualisierungen verursachen, und verpasste Aktualisierungen können zu unerkannten Bearbeitungskonflikten führen. Die Multi-Master-Replikation ist eine nicht-triviale Aufgabe. –

+0

Vielen Dank für die freundliche Beratung. Hoffentlich können Sie in ein paar Wochen die Früchte Ihrer Weisheit sehen. Die fragliche Seite ist bereits verfügbar (www.ayenotes.com), aber die iPhone App ist es nicht. – hyuan

0

Also ich denke, zusammenfassend beziehen sich Ihre Fragen auf getrennte Synchronisierung.

Also hier ist, was ich denke passieren sollte:

Initial Sync Sie rufen die Daten und alle Informationen mit ihm verbunden (Zeilenversionen, Datei Prüfsummen usw.). Es ist wichtig, dass Sie diese Informationen speichern und sie bis zur nächsten erfolgreichen Synchronisierung unverändert lassen. Änderungen sollten bei einer Kopie dieser Daten vorgenommen werden.

Verfolgen von Änderungen Wenn Sie mit Datenbankzeilen arbeiten, ist die Idee, dass Sie Vorgänge einfügen, aktualisieren und löschen müssen. Wenn Sie mit Textdateien wie xml arbeiten, dann ist es etwas komplizierter. Wenn es wahrscheinlich ist, dass mehrere Benutzer diese Datei gleichzeitig bearbeiten, müssten Sie ein Diff-Tool haben, damit Konflikte auf einer detaillierteren Ebene (statt der gesamten Datei) erkannt werden können.

Auf Konflikte prüfen Wenn Sie nur mit Datenbankzeilen arbeiten, sind Konflikte leicht zu erkennen. Sie können eine andere Spalte haben, die erhöht wird, wenn die Zeile aktualisiert wird (ich denke, Mssql hat diese eingebaute nicht sicher über MySQL). Wenn also die Kopie eine andere Nummer hat als die auf dem Server, dann liegt ein Konflikt vor. Für Dateien oder Zeichenfolgen wird eine Prüfsumme benötigt. Ich nehme an, Sie könnten das modifizierte Datum auch verwenden, aber stellen Sie sicher, dass Sie eine sehr genaue und genaue Messung haben, um Fehler zu vermeiden.Zum Beispiel: Sagen wir, ich bekomme eine Datei und Sie speichern sie, sobald ich sie abgerufen habe. Nehmen wir an, der Zeitunterschied ist eine 1 Millisekunde. Ich mache dann Änderungen an der Datei, dann versuche ich es zu speichern. Wenn die aufgezeichnete Zeit für die letzte Änderung nur auf 10 Millisekunden genau ist, besteht eine gute Chance, dass die von mir abgerufene Datei das gleiche Datum hat wie das gespeicherte, sodass das Programm keinen Konflikt erkennt und Ihre Änderungen überschreibt. Daher verwende ich diese Methode im Allgemeinen nicht, um auf der sicheren Seite zu sein. Auf der anderen Seite ist die Wahrscheinlichkeit einer Prüfsummen-/Hash-Kollision nach einer geringfügigen Modifikation nahezu gleich Null.

Auflösen von Konflikten Dies ist nun der schwierige Teil. Wenn dies ein automatisierter Prozess ist, müssen Sie die Situation beurteilen und entscheiden, ob Sie die Änderungen überschreiben, Ihre Änderungen verlieren oder die Daten erneut vom Server abrufen und versuchen möchten, die Änderungen zu wiederholen. Zum Glück für Sie scheint es, dass es menschliche Interaktion geben wird. Aber es ist immer noch eine Menge Schmerzen zu programmieren. Wenn Sie mit Datenbankzeilen arbeiten, können Sie jede einzelne Spalte überprüfen und sie mit den Daten auf dem Server vergleichen und sie dem Benutzer präsentieren. Die Idee besteht darin, Konflikte dem Benutzer sehr detailliert zu präsentieren, um sie nicht zu überwältigen. Die meisten Konflikte haben sehr kleine Unterschiede an vielen verschiedenen Stellen, so dass es für den Benutzer einen kleinen Unterschied auf einmal darstellt. Also für Textdateien ist es fast gleich, aber hundertmal komplizierter. Also im Grunde müssten Sie ein Diff-Tool erstellen oder verwenden (Textvergleich ist ein ganz anderes Thema und ist zu weit gefasst, um es hier zu erwähnen), das Sie über die kleinen Änderungen in der Datei informiert und in ähnlicher Weise wie in a Datenbank: Hier wurde Text eingefügt, gelöscht oder bearbeitet. Dann präsentieren Sie das dem Benutzer auf die gleiche Weise. Im Grunde müsste der Benutzer also für jeden kleinen Konflikt entscheiden, ob er seine Änderungen verwerfen, Änderungen auf dem Server überschreiben oder eine manuelle Bearbeitung durchführen möchte, bevor er an den Server gesendet wird.

Also, wenn Sie die Dinge richtig gemacht haben, sollte der Benutzer eine Liste von Konflikten gegeben werden, wenn es welche gibt. Diese Konflikte sollten granular genug sein, damit der Benutzer schnell entscheiden kann. Zum Beispiel ist der Konflikt eine Rechtschreibänderung von, es wäre einfacher für den Benutzer, aus Wortschreibweisen zu wählen, im Gegensatz dazu, dem Benutzer den ganzen Absatz zu geben und ihm zu sagen, dass es eine Änderung gab und dass sie entscheiden müssen, was zu tun ist Der Benutzer müsste dann nach diesem kleinen Rechtschreibfehler suchen.

Andere Überlegungen: Datenvalidierung - Denken Sie daran, dass Sie nach der Konfliktlösung eine Validierung durchführen müssen, da sich die Daten möglicherweise geändert haben. Textvergleich - wie ich schon sagte, ist dies ein großes Thema. also google es! Getrennte Synchronisation - Ich denke, es gibt ein paar Artikel da draußen.

Quelle: https://softwareengineering.stackexchange.com/questions/94634/synchronization-web-service-methodologies-or-papers

Verwandte Themen