Frage

Ich arbeite an der Synchronisierung zweier Geschäftsobjekte zwischen einem iPhone und einer Website mithilfe einer XML-basierten Nutzlast und würde gerne einige Ideen für eine optimale Routine einholen.

Der Charakter dieser Frage ist jedoch ziemlich allgemein gehalten und ich kann mir vorstellen, dass sie auf eine Vielzahl unterschiedlicher Systeme anwendbar ist, die Geschäftsobjekte zwischen einer Webeinheit und einem Client (Desktop, Mobiltelefon usw.) synchronisieren müssen.

Die Geschäftsobjekte können auf beiden Seiten bearbeitet, gelöscht und aktualisiert werden.Beide Seiten können das Objekt lokal speichern, die Synchronisierung wird jedoch nur auf der iPhone-Seite für die getrennte Anzeige initiiert.Alle Objekte haben einen aktualisierten_at- und einen erstellten_at-Zeitstempel und werden auf beiden Seiten von einem RDBMS unterstützt (SQLite auf der iPhone-Seite und MySQL im Web...Auch hier glaube ich nicht, dass das eine große Rolle spielt) und das Telefon zeichnet den letzten Synchronisierungsversuch auf.Ansonsten werden (derzeit) 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öschvorgängen umgehen, wenn „vorläufiges Löschen“ keine Option wäre?Welche Datenmodelländerungen würden Sie hinzufügen, um dies zu erleichtern?

War es hilfreich?

Lösung

Der einfachste Ansatz:Übertragen Sie beim Synchronisieren alle Datensätze where updated_at >= @last_sync_at.Nachteil:Dieser Ansatz toleriert Taktversatz überhaupt nicht gut.

Es ist wahrscheinlich sicherer, eine Spalte mit der Versionsnummer beizubehalten, die bei jeder Aktualisierung einer Zeile erhöht wird (damit der Taktversatz Ihren Synchronisierungsprozess nicht beeinträchtigt) und eine Versionsnummer der letzten Synchronisierung (damit potenziell widersprüchliche Änderungen identifiziert werden können).Um dies bandbreiteneffizient zu gestalten, behalten Sie in jeder Datenbank einen Cache für die letzte Version, die an jeden Replikations-Peer gesendet wurde, sodass nur geänderte Zeilen übertragen werden müssen.Wenn es sich um eine Sterntopologie handelt, können die Blätter ein vereinfachtes Schema verwenden, bei dem die zuletzt synchronisierte Version in jeder Tabelle gespeichert wird.

Um die Synchronisierung von Löschvorgängen zu unterstützen, ist eine Form von Soft-Deletes 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. Andernfalls besteht die Möglichkeit, dass ein vernachlässigtes Replikat einen Datensatz wiederbelebt, von dem Sie dachten, dass er gelöscht wurde.

Andere Tipps

Ich denke also zusammenfassend Ihre Fragen getrennt Synchronisation beziehen.

So, hier ist das, was ich denke, geschehen soll:

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 unberührte bis zum nächsten erfolgreichen Sync lassen. Änderungen sollten auf einer Kopie dieser Daten vorgenommen werden.

Nachverfolgen von Änderungen Wenn Sie mit Datenbankzeilen zu tun haben, die Idee ist, müssen Sie im Grunde einfügen, aktualisieren verfolgen und Löschvorgänge. Wenn Sie mit Textdateien, wie XML zu tun hat, dann ist es etwas komplizierter. Wenn es wahrscheinlich, dass mehrere Benutzer diese Datei gleichzeitig bearbeiten, dann würden Sie ein Diff-Tool haben müssen, so können Konflikte in einer detaillierteren Ebene nachgewiesen werden (statt der gesamten Datei).

für Konflikte erneut prüfen, wenn Sie mit Datenbankzeilen nur zu tun hat, Konflikte sind leicht zu erkennen. Sie können eine andere Spalte, die erhöht, wenn die Zeile aktualisiert wird (ich glaube, mssql diese builtin hat nicht sicher mysql). Wenn also die Kopie, die Sie als eine andere Nummer hat, was auf dem Server ist, dann haben Sie einen Konflikt. Für Dateien oder Strings, wird eine Prüfsumme des Job. Ich nehme an, Sie auch Änderungsdatum verwenden können, aber stellen Sie sicher, dass Sie eine sehr präzise und genaue Messung haben Misses zu verhindern. zum Beispiel: können sagen, ich eine Datei abrufen und speichern Sie es, sobald ich sie abgerufen. Sagen wir die Zeitdifferenz eine 1 Millisekunde ist. Ich mache Änderungen dann die Datei dann versuche ich es zu retten. Wenn die aufgezeichnete Zeit der letzten Änderung nur auf 10 Millisekunden genau ist, ist es eine gute Chance, dass die Datei Ich werde abgefragt, die die gleiche Änderungsdatum wie die gespeichert Sie so das Programm denkt Theres keinen Konflikt und überschreibt die Änderungen. Also habe ich diese Methode nicht allgemein nur verwenden, um auf der sicheren Seite zu sein. Auf der anderen Seite sind die Chancen einer Prüfsumme / Hash-Kollision nach einer geringfügigen Änderung in der Nähe keine.

Lösen von Konflikten Nun ist dies der schwierige Teil. Wenn dies ein automatisierter Prozess ist, dann würden Sie die Situation beurteilen müssen und entscheiden, ob Sie die Änderungen überschreiben möchten, verlieren Sie Ihre Änderungen oder die Daten vom Server abzurufen wieder und versuchen, die Änderungen zu wiederholen. Zum Glück für Sie, so scheint es, dass es die menschliche Interaktion sein. Aber es ist immer noch eine Menge Schmerzen Code. Wenn Sie mit Datenbankzeilen zu tun haben, können Sie jede einzelne Spalte überprüfen und vergleichen sie mit den Daten auf dem Server und präsentieren sie an den Benutzer. Die Idee ist, Konflikte zu dem Benutzer in einer sehr körnigen Weise zu präsentieren, um sie nicht zu überwältigen. Die meisten Konflikte haben sehr kleine Unterschiede in vielen verschiedenen Orten so präsent es dem Benutzer einen kleinen Unterschied zu einem Zeitpunkt. Also für Textdateien, die fast die gleichen, aber mehr hundertmal komplizierter. Also im Grunde müßten Sie ein Diff-Tool erstellen oder verwenden (Text Vergleich ist ein ganz anderes Thema und ist zu breit, hier zu erwähnen), die Sie in der Datei kennen, von den kleinen Änderungen kann und wo sie sind in ähnlicher Weise wie in a Datenbank: wo Text eingefügt wurde, gelöscht oder bearbeitet werden. präsentieren dann, dass für den Benutzer in der gleichen Weise. so dass im Grunde für jeden kleinen Konflikt, müßte der Benutzer wählen, ob ihre Änderungen zu verwerfen, überschreiben Änderungen in dem Server oder eine manuelle Bearbeitung durchführt, bevor an den Server zu senden.

Also, wenn Sie die Dinge richtig gemacht haben, sollte der Benutzer eine Liste der Konflikte gegeben werden, wenn es welche gibt. Diese Konflikte sollten granular genug sein, damit der Benutzer schnell zu entscheiden. So zum Beispiel, ist der Konflikt ein Rechtschreib Wechsel von, wäre es einfacher für die Benutzer von Wort Schreibweisen im Gegensatz zu wählen, um dem Benutzer den gesamten Absatz zu geben und ihm zu sagen, dass es eine Änderung war und dass sie sich entscheiden müssen, was zu tun ist würde der Benutzer dann für diese kleinen Rechtschreibfehler zu jagen hat.

Weitere Überlegungen: Datenvalidierung - bedenken Sie, dass Sie die Validierung durchgeführt haben conflic nach LösungTextvergleich verändert ts, da die Daten haben könnte - wie ich schon sagte, ist dies ein großes Thema. so Google es! Disconnected Synchronisation - Ich denke, es gibt ein paar Artikel gibt

.

Quelle: https://softwareengineering.stackexchange.com/questions/94634 / Synchronisation-Web-Service-Methoden-oder-Papiere

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top