Was ist die beste Methode zum Offline-Failover eines desktopbasierten Clients, der einen Webdienst verwendet?

13

Ich habe drei eingehende Projekte, die ein gemeinsames Problem haben:

Sie benötigen die Logik auf einem Websystem und eine lokale Anwendung (z. B. eine Verkaufsstelle), die über einen RESTful-Webservice mit einem solchen System kommuniziert.

Meine Lösung

Die Lösung, die ich gefunden habe, besteht darin, die Nachrichtenwarteschlange der Desktopanwendung zu implementieren , um Vorgänge zu speichern, während der Dienst offline ist, genauer gesagt, die asynchrone Nachrichtenwarteschlange . Dies ist jedoch der einfache Teil (falls dies die beste Lösung ist). Ich beschäftige mich auch mit Datensynchronisation und Konfliktlösung.

Das Hauptsystem muss webbasiert sein, da für die Berichte und die Überwachung durch die Beteiligten eine Web-App erforderlich ist und die Webservices Anfragen für mehrere Einrichtungen bearbeiten würden.

Die Desktop-Clients (vorzugsweise Thin) werden mit Java (genauer Netbeans) und das Web-System mit Symfony2 implementiert. Zwei der Projekte erfordern eine Hardwareintegration für den Client, sodass die Desktop-Anwendung mit Web-Technologie (z. B. Appcelerator Titanium) zu einem großen Problem werden kann.

Meine Frage

  1. Was ist eine bessere skalierbare Lösung, die maximale Effizienz bei minimalem Aufwand bedeutet (und möglichst keine zusätzlichen Kosten wie den Kauf eines Backup-Servers für den lokalen Betrieb)?

  2. Wer hat sich sonst noch damit beschäftigt? Wie haben Sie Ihr Problem gelöst? Welche Lektionen kannst du teilen?

  3. Wie sind Sie mit der Synchronisation umgegangen?

Bearbeiten: Ein fehlender Teil wurde zu meiner Frage in Punkt 3 hinzugefügt

dukeofgaming
quelle

Antworten:

3

Ich weiß, dass Ihre Frage Java ist, aber ich mag diese Nachrichtenbus-Architektur für diese Art von Dingen wirklich .

Grundsätzlich erhalten Nachrichten beim Senden möglicherweise zwei Antworten. Der erste stammt aus dem lokalen Cache, der zweite kommt vom Server, sobald eine Verbindung hergestellt wurde.

Ich bin mir ziemlich sicher, dass Sie diese Architektur (Rhino Bus und Nhib) ganz einfach an Ihre (MQ und Hib) anpassen können.

Bach
quelle
Ja, ich habe genau nach dieser Art von nachrichtenorientierter Architektur gesucht. Die Cache-Argumente und der letzte Satz in Ihrem Link haben mich überzeugt.
dukeofgaming
10

Machen Sie alles lokal und synchronisieren Sie es regelmäßig .

Folgendes würde ich tun, wenn ich Sie wäre (mir ist das Synchronisierungsframework in Java wie in .NET nicht bekannt).

Behalten Sie in der lokalen Anwendung einen Zeitstempel bei, der das letzte Mal enthält, wenn Sie eine Verbindung erfolgreich hergestellt haben.

Unabhängig davon, wann Sie die Verbindung wiederherstellen, wird dieser Zeitstempel verwendet, um neue Daten abzurufen und dann neue Bestellungen zu senden, die lokal generiert wurden.

Sie erhalten dann zwei Zeitstempel. Eine, um festzulegen, wann die Bestellung erstellt wurde (lokal oder online), und eine, wann sie vom Server aufgezeichnet wurde.

Ich empfehle Message Queuing dafür nicht. Ich habe MQ in der Vergangenheit für eine E-Commerce-Website verwendet, die mit Navision verbunden werden musste. Alles wurde in Navision ausgeführt und die Änderungen wurden über MQ an die E-Commerce-Website gesendet, einschließlich des Bestellstatus und aller Informationen zu Produktbeschreibungen, Preisen usw. Neue Bestellungen wurden auch über MQ an Navision gesendet.

Walter
quelle
Hmmm, ich mag die Idee eines Push-Modells, sehe jedoch das Problem, dass es bei einer Änderung der Computerzeit zu Datenverlust kommen kann. Übrigens habe ich die Konvention, dass jeder Datensatz in meinen Datenbankentwürfen mit einem Zeitstempel versehen wird. Warum empfehlen Sie MQ nicht?
dukeofgaming
Das ist richtig, Sie müssen zeitsynchronisierte PCs und UTC verwenden, aber es ist jetzt ziemlich Standard (zumindest unter Windows). MQ ist manchmal notwendig, aber ich denke, es wäre zu viel für die Art von Anwendung, die Sie entwickeln.
Okay, um der Zuverlässigkeit Priorität einzuräumen, ist es besser zu glauben, dass die Desktop-App getrennt wird, und daher ist es besser, die Desktop-App als erstklassigen Bürger zu behandeln, aber ich habe immer noch den Eindruck, dass MQ dies tun würde ein einfacher Ersatz für eine lokale Datenbankimplementierung sein. Ich denke auch, dass alle CRUD-Operationen auf dem Server implizit eine bessere Sicherheit bieten. Was halten Sie von diesen beiden Punkten?
dukeofgaming
@dukeofgaming: In meinem Fall können Bestellungen von jedem POS aus entgegengenommen werden (auch die Anwendung kann als System zur Auftragsannahme und nicht als System zur Auftragsabwicklung verwendet werden), einschließlich Web. Alles wurde im ganzen Land verteilt. Es war absolut notwendig, dass jeder Desktop im Falle einer Trennung autonom ist. MQ würde auch in diesem Szenario funktionieren, also bin ich nicht dagegen. Ich halte es einfach für einfacher, eine starke Datensynchronisation zwischen Masterservern und Clients zu implementieren. Daher war eine CRUD-Operation auf dem Master-Server keine Option.
2
+1 - so habe ich es in der Vergangenheit gesehen. Ich würde auch sagen, dass die Verwendung von Uniqueidentifier (Guids) als Primärschlüssel die Dinge immens vereinfacht. Dies ist eines der Dinge, die Ihnen das Leben später wirklich erleichtern, wenn Sie eine Synchronisierung benötigen.
Scott Whitlock
1

Oder Sie sollten sich gelegentlich verbundene Systemdatenbankimplementierungen ansehen, bei denen die Synchronisierung von Remoteclients mit dem Server problematisch ist. (SQL Server hat dies zu einem gewissen Grad mit SQL CE zu tun, Outlook tut dies).

Auf diese Weise können Sie alle Ihre Änderungen lokal in einer kleinen Footprint-Datenbank vornehmen (Versionsverwaltung / logische Zeitstempel usw., damit Sie sich keine Gedanken über PC-Uhren usw. machen müssen). Wenn Sie online gehen, synchronisieren Sie diese mit der Hauptdatenbank Server.

Ich würde mich nicht für eine REST-Lösung entscheiden, wenn das System die meiste Zeit nicht online sein kann.

Subu Sankara Subramanian
quelle
Beschreiben Sie eine verteilte Datenbank? Können Sie das näher erläutern?
dukeofgaming
Nein - dies ist keine verteilte Datenbank im eigentlichen Sinne. Eine verteilte Datenbank erwartet normalerweise, dass fast alles auch online ist, aber auch hier gilt die Logik der Replikation unter Peers, die untergegangen ist. Es gibt einige Desktop- / Gerätedatenbanken, die die Replikationsarbeit ausführen können ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… ). Sie müssen also nur diese Gerätedatenbank einrichten. Hier können Sie Ihre Änderungen protokollieren. Wenn Sie eine Verbindung zum Computernetzwerk herstellen, rufen Sie die Synchronisierung auf. Dadurch wird die Datenübertragung zum Hauptserver für Sie durchgeführt.
Subu Sankara Subramanian