Ich entwerfe ein System, von dem aus ich Geschäftsdaten vom mobilen Gerät (mit einer eingebetteten Anwendung) synchronisiere, das Daten generiert und an den Server zurücksendet. Jede synchronisierte Zeile generiert ein bestimmtes Geschäftsprotokoll in der Datenbank.
Wenn das, was ich synchronisiere, Daten mit einem Datum (innerhalb der Synchronisierungsdaten) generiert, das unter dem Datum der letzten Änderung meiner Geschäftsdaten liegt, muss ich es ignorieren und einfach die Anmeldedatenbank hinzufügen. Sobald die hochgeladenen Daten verarbeitet sind, werden Daten aus der Datenbank abgerufen und auf das Gerät heruntergeladen.
Aufgrund dieses Downloads direkt nach dem Schreiben muss die Synchronisation synchron sein. Es ist immer noch möglich, ein Lese- / Schreibmuster zu haben, wenn so etwas genug wert ist, um meine bestehende Lösung zu ersetzen. Wichtiger ist es, aktuelle Daten herunterladen zu können. Da diese Daten als Ganzes abgerufen werden, ist derzeit kein Diff implementiert (es kann später kommen, aber das ist kein Problem).
Möglicherweise werden mehrere Synchronisierungen für dasselbe Geschäftsobjekt ausgeführt. Dies ist unwahrscheinlich, kann jedoch auftreten, und ich bevorzuge es, damit umgehen zu können. Die Synchronisierung wird voraussichtlich einige Sekunden, jedoch nicht einige Minuten dauern, es sei denn, Sie verwenden die eingebettete mobile Anwendung einige Tage lang ohne erneute Synchronisierung.
Es wird nicht erwartet, dass das synchronisierte Datenvolumen groß ist, ebenso wenig wie der Synchronisierungsprozess.
Daher verwende ich einen gegenseitigen Ausschluss für meine Synchronisationsmethode, genauer gesagt, ich verwende Java und setze eine synchronisierte Schreibmethode ein, nicht den gesamten Synchronisationsprozess, um die schreibgeschützte Synchronisation nicht zu blockieren.
Ich würde gerne wissen :
- Ob dieser Weg Sinn macht? Solange das Volumen und die Zeit des Synchronisationsprozesses noch akzeptabel sind.
- Welche Konzepte sollte ich allgemein betrachten? Bonus: Wenn diese Konzepte in einem Spring-Modul implementiert sind.
quelle
Antworten:
Ein Ansatz , dass ich für eine Weile jetzt untersucht (mit einigem Erfolg) Kundendaten mit Server - Daten synchronisieren bis haben, ohne zu Terminen zu verlassen (die möglicherweise unzuverlässig sein) oder synchrone Anforderungen, ist eine Kombination aus JSON Patches (vielleicht POJO s in Ihrem Fall) und Event-Sourcing .
Die Grundidee besteht darin, dass Client und Server nicht den aktuellen Status auf dem Client und dem Server speichern, sondern eine Liste der Änderungen speichern und sich gegenseitig über Ereignisse oder Patch-Anforderungen benachrichtigen.
Anstatt dass der Client alle Daten plus ein Datum an den Server sendet, sendet der Client ein Ereignis zusammen mit einer Revisionsnummer, die dem letzten Zeitpunkt entspricht, an dem der Client glaubt, dass die Daten aktualisiert wurden. Etwas wie das:
Sobald der Server dieses Ereignis (asynchron) erhält, stimmt er es mit anderen Ereignissen ab, die er möglicherweise bereits empfangen hat. Beispielsweise ist es möglich, dass ein anderer Client, der mit denselben Daten arbeitet, bereits einige Änderungen vorgenommen hat und die Versionsnummer auf dem Server jetzt bei 5 liegt. Daher muss diese Überarbeitung angewendet werden, bevor die letzten beiden angewendet wurden, und alle Kunden müssen über diese Änderung informiert werden.
Sobald der Server fertig ist, benachrichtigt er alle interessierten Clients über die vorgenommenen Änderungen und die neue aktuelle Versionsnummer. Der Client wendet diese Änderungen dann an und aktualisiert seine interne Revisionsnummer.
Ihr Kilometerstand kann variieren, aber ich hoffe, das hilft.
Bearbeiten: Ein anderer Name für diesen Ansatz oder eine Variation davon wird als Nachrichtenwarteschlange bezeichnet , wie in dieser verwandten Frage erwähnt .
quelle
Das erste Problem ist die Verwendung von Datumsangaben zum Synchronisieren von Daten. Ich bin mir wirklich sicher, dass ich nicht alle Details Ihrer Lösung erhalten habe, aber ich würde sagen:
Werden die Daten auf den Handys generiert? Sind Sie in diesem Fall sicher, dass die auf den Handys ausgeführte App immer die richtigen Daten verwendet? Was ist mit einem böswilligen Benutzer, der das Systemdatum auf seinem Mobilgerät etwas ändern kann? Was ist mit Benutzern in verschiedenen Zeitzonen? Wie @jeffrey Ihnen sagte, ist es möglicherweise nicht der beste Ansatz, sich auf Daten zu verlassen, die auf den Geräten generiert wurden.
Wenn ich es richtig verstanden habe, verwenden Sie Optimistic Concurrency Control . Ich sehe nichts, was in Ihrem Ansatz an sich falsch ist.
In dieser Frage geht es um die Implementierung von Optimistic Locking im Frühjahr . Vielleicht können Sie sich darin inspirieren lassen.
quelle