Datensynchronisation in mobilen Apps - mehrere Geräte, mehrere Benutzer

42

Ich bin gerade dabei, meine erste mobile App zu erstellen. Eines der Hauptmerkmale der Anwendung ist, dass mehrere Geräte / Benutzer Zugriff auf dieselben Daten haben - und alle von ihnen haben CRUD-Rechte.

Ich glaube, die Architektur sollte einen zentralen Server beinhalten, auf dem alle Daten gespeichert sind. Die Geräte verwenden eine API, um mit dem Server zu interagieren und seine Datenoperationen auszuführen (z. B. Hinzufügen eines Datensatzes, Bearbeiten eines Datensatzes, Löschen eines Datensatzes).

Ich stelle mir ein Szenario vor, in dem die Synchronisierung der Daten zum Problem wird. Angenommen, die Anwendung sollte funktionieren, wenn sie nicht mit dem Internet verbunden ist und daher nicht mit diesem zentralen Server kommunizieren kann. Damit:

  1. Benutzer A ist offline und bearbeitet Datensatz Nr. 100
  2. Benutzer B ist offline und bearbeitet Datensatz Nr. 100
  3. Benutzer C ist offline und löscht Datensatz Nr. 100
  4. Benutzer C geht online (vermutlich sollte Datensatz Nr. 100 auf dem Server gelöscht werden)
  5. Benutzer A und B werden online geschaltet, aber die von ihnen bearbeiteten Datensätze sind nicht mehr vorhanden

Es können alle möglichen ähnlichen Szenarien auftreten.

Wie wird das allgemein gehandhabt? Ich habe vor, MySQL zu verwenden, frage mich aber, ob es für ein solches Problem nicht geeignet ist.

ProgrammerNewbie
quelle

Antworten:

30

Ich arbeite derzeit an einer mobilen / Desktop- / verteilten App mit genau den gleichen Anforderungen und Problemen.

Erstens sind diese Anforderungen nicht an sich für mobile Apps, sondern für alle getrennten / verteilten Client-Server-Transaktionen (parallele Programmierung, Multithreading, Sie verstehen das). Als solche sind sie natürlich typische Probleme, die in mobilen Apps behoben werden müssen.

Im Allgemeinen läuft alles darauf hinaus, dass Sie einen potenziellen Datensatz haben, der an n Clients verteilt wird, die ihn gleichzeitig bearbeiten können. Was Sie brauchen, ist

  1. einen ordnungsgemäßen Versionskontroll- / Sperrmechanismus,
  2. eine ordnungsgemäße Rechte- / Zugriffsverwaltung,
  3. eine richtige Synchronisations- / Caching-Strategie

Für (1) können Sie einige Muster anwenden: Es gibt zwei häufig verwendete Sperrstrategien : Optimistisches Offline- Sperren und Pessimistisches Offline- Sperren . Einige davon werden in verschiedenen Versionskontroll- "Mustern" angewendet, z. B. " MultiVersion Concurrency Control" (MVCC), bei der für jeden Datensatz ein Zähler (eine Art sehr einfacher "Zeitstempel") verwendet wird, der bei jeder Änderung des Datensatzes aktualisiert wird .

(2) und (3) sind sehr weit gefasste Themen, die unabhängig von (1) behandelt werden müssen. Einige Ratschläge aus meiner Erfahrung:

  • Verwenden Sie eine Client-Server-Technologie, mit der die meisten Probleme für Sie beseitigt werden. Ich empfehle dringend eine Web-Technologie wie CouchDb , die (1) über Optimistic Offline Locking + MVCC, (2) über Web-API und (3) über HTTP-Caching sehr gut verarbeitet.

  • Versuchen Sie, Dinge nicht selbst zu erfinden, wenn Sie sich auf bewährte Technologien und Ansätze verlassen können. Ich bin der Meinung, dass jede Stunde, die Sie mit der Erforschung und dem Vergleich vorhandener Technologien / Muster verbringen, weitaus besser ist als der Versuch, Ihre eigenen Systeme zu implementieren.

  • Verwenden Sie möglichst homogene Technologien. Mit "homogen" meine ich Technologien, die nach denselben Grundsätzen erstellt wurden, z. B. Web 2.0-Nutzungsszenarien. Ein Beispiel: Die Verwendung eines geeigneten CouchDb- und REST-Clients (Web-API) mit einer lokalen Caching-Strategie ist die bessere Wahl als die Verwendung von SQL für mobile Apps.

  • Ich rate dringend von der Verwendung von MySQL ab, da es sich um eine Technologie handelt, die nicht explizit für solche Verwendungsszenarien entwickelt wurde. Es funktioniert, aber mit einem Datenbanksystem, das bereits den Stil der Webkommunikation und der Parallelität (wie z. B. vielen NoSQL-Datenbanken) unterstützt, sind Sie viel besser dran.

Übrigens habe ich mich für CouchDb mit einem benutzerdefinierten lokalen Client entschieden, der gegen die CouchDb-APIs arbeitet, die einwandfrei funktionieren und skalieren. Ich habe von MSQL + (N) Hibernate gewechselt und einen hohen Preis dafür bezahlt, dass ich nicht die richtige Wahl getroffen habe (was bedeutet, dass ich nicht genug recherchiert habe).

Sebastian
quelle
+1 Optimistisches vs. pessimistisches Sperren war das erste, was mir in den
10

Zunächst haben Sie sowohl eine API als auch eine Datenbank (MySQL) erwähnt. Ich empfehle dringend, dass Sie eine API verwenden und nicht versuchen, direkt zwischen den Datenbanken zu kommunizieren. Diese letztere Route wird überhaupt nicht gut skalieren.

Ein guter Ausgangspunkt, den Sie berücksichtigen sollten, ist die Verwendung von Apache CouchDB . Es basiert auf HTTP und JSON, ist schemafrei und verfügt über einen sehr guten Replikationsmechanismus. Wir verwenden es, um ein ähnliches Problem zu lösen.

Der Replikationsmechanismus von CouchDB verwendet dieselbe HTTP-API wie jeder andere Client. Im Wesentlichen wird die Replikation über eine API bereitgestellt.

Für iOS empfehle ich die Verwendung des Couchbase Lite-Projekts . Es funktioniert sehr gut zum Synchronisieren von Daten. Für Android arbeitet die gleiche Firma, die das oben genannte Couchbase Lite-Projekt erstellt, an einem ähnlichen Angebot - Couchbase Lite für Android . Es ist nicht so vollständig wie die iOS-Version und es bleibt noch einiges zu tun.

Bei CouchDB sind jedoch einige Punkte zu beachten.

  1. Sie müssen Ihre eigene Konfliktlösung bereitstellen. Glücklicherweise behält CouchDB bei Konflikten die widersprüchlichen Versionen und Picks und willkürlichen, aber deterministischen Konflikte als Hauptversion bei. Sie könnten also in Erwägung ziehen, die Konfliktlösung für Ihre ursprüngliche Version zu verzögern.
  2. Der Replikationsmechanismus dient zum Replizieren von Datenbanken und nicht zur eigentlichen Synchronisation. Wenn Sie also viele gelöschte Dokumente haben, dauert die Replikation vom Server zum Client immer länger. Es gibt eine Möglichkeit, dies mithilfe der "Datenbankrotation" zu vermeiden. Dadurch werden alte Löschvorgänge im Wesentlichen entfernt.
  3. Sie können die Replikationsreihenfolge nicht steuern. Sie können jedoch einige clevere Lösungen zur Verbesserung der Replikationsleistung finden, z. B. die Verwendung der gefilterten Replikation, um zuerst einige Dokumente abzurufen, oder sogar bei Bedarf direkt auf den Server zugreifen.
  4. Die Replikation findet unter iOS nicht im Hintergrund statt. Sie können das iOS SDK verwenden, um einige Fälle der Hintergrundreplikation bereitzustellen.

Wenn Sie CouchDB nicht verwenden möchten, können Sie es zumindest als Referenz für die Erstellung eines Synchronisationsalgorithmus mithilfe einer HTTP-API verwenden. Mein Vorschlag wäre, mit CouchDB zu beginnen und dann, wenn Sie etwas Benutzerdefinierteres benötigen, in Betracht zu ziehen, Ihre eigenen zu rollen.

David V
quelle
Mein Plan für die API war die Implementierung einer RESTful-API mit CodeIgniter, die mit jeder erforderlichen DB-Lösung interagiert. Ich habe nicht daran gedacht, ein DB-System mit einer integrierten API zu verwenden. Stimmt mein Plan mit Ihrer Antwort nicht überein?
ProgrammerNewbie
Außerdem schaue ich mir jetzt CouchDB an. Würde ich die Anwendung nur mit CouchDB erstellen? Oder würde ich immer noch so etwas wie MySQL in Verbindung mit CouchDB verwenden? Zum Beispiel wird die Anwendung immer noch ein Grundbedürfnis nach einem RDBMS haben. Modelliere ich diese Art von Daten in MySQL und füge die Daten, die synchronisiert werden müssen, in CouchDB ein?
ProgrammerNewbie
Bitte geben Sie Ihren "Bedarf an einem RDBMS" an. Was bietet es, dass CouchDb nicht tut? CouchDb ist eine NoSQL-Datenbank, sodass Sie kein zusätzliches MySQL benötigen. Darüber hinaus können Sie mit CouchDb einen langen Weg ohne Mittelschicht zurücklegen, da Sie die API-Aufrufe mit JavaScript abfangen und Ihre Ausgabe mit Ansichten erstellen können.
Sebastian
@ProgrammerNewbie, Ihr Plan scheint im Allgemeinen gut zu sein: Lassen Sie sich von einer API aus der Datenbank abstrahieren. CouchDB erledigt dies in gewisser Weise, aber Sie sind nicht vollständig von der Tatsache, dass es sich um CouchDB handelt, abstrahiert. In Bezug auf Ihre zweite Frage weiß ich auch nicht, warum Sie ein RDBMS benötigen. CouchDB bietet Karten- / Reduzierungsansichten zum Bereitstellen von Abfragen zu Daten, Filtern, Änderungsnachverfolgung und vielem mehr.
David V
@Sebastian - Ich kenne NoSQL einfach nicht und frage mich, ob ich für meine relationalen Daten noch ein RDBMS benötige.
ProgrammerNewbie