Quelle est la meilleure façon d'effectuer un basculement hors ligne d'un client de bureau utilisant un service Web?

13

J'ai trois projets entrants qui partagent un problème commun:

ils doivent avoir la logique sur un système Web et ils ont besoin d'une application locale (par exemple point de vente) qui communique avec un tel système via un service Web RESTful.

Ma solution

La solution que j'ai réussi à trouver consiste à implémenter dans la file d' attente de messages de l' application de bureau pour stocker les opérations alors que le service est hors ligne, plus précisément, la file d'attente de messages asynchrone . Cependant, c'est la partie facile (si telle est la meilleure solution). Je m'intéresse également à la synchronisation des données et à la résolution des conflits.

Le système principal doit être basé sur le Web, car une application Web est requise pour les rapports et le suivi par les parties prenantes, et les services Web traiteraient les demandes de plusieurs établissements.

Les clients de bureau (de préférence légers) seront implémentés avec Java (plus spécifiquement Netbeans) et le système web avec Symfony2. Deux des projets nécessitent une intégration matérielle pour le client, donc rendre l'application de bureau avec la technologie Web (par exemple Appcelerator Titanium) pourrait être une douleur majeure.

Ma question

  1. Quelle est une meilleure solution qui évolue, ce qui signifie une efficacité maximale avec un minimum d'effort (et de préférence sans frais supplémentaires, comme l'achat d'un serveur de sauvegarde pour un fonctionnement local)?

  2. Qui d'autre s'en est occupé auparavant? Comment avez-vous résolu votre problème? Quelles leçons pouvez-vous partager?

  3. Comment avez-vous géré la synchronisation?

Edit: Ajout d'une partie manquante à ma question au point # 3

dukeofgaming
la source

Réponses:

3

Je sais que votre question est java, mais j'aime vraiment cette architecture de style bus de messages pour ce genre de chose.

Fondamentalement, lorsque les messages sont envoyés, ils obtiennent potentiellement deux réponses. Le premier provient du cache local, le second provient du serveur une fois qu'il est connecté.

Je suis presque sûr que vous pourriez facilement adapter cette architecture (bus rhino et nhib) à la vôtre (MQ et hib).

Ruisseau
la source
Oui, je cherchais exactement ce type d'architecture orientée message. Les arguments du cache et la dernière phrase de votre lien m'ont convaincu.
dukeofgaming
10

Faites tout localement et synchronisez périodiquement .

Voici ce que je ferais si j'étais vous (je ne connais pas le framework de synchronisation en Java comme nous l'avons en .NET).

Conservez un horodatage dans l'application locale qui tiendra la dernière fois que vous vous êtes connecté avec succès.

Quelle que soit l'heure à laquelle vous vous reconnectez, cet horodatage sera utilisé pour extraire de nouvelles données, puis envoyer de nouvelles commandes générées localement.

Vous conserverez ensuite deux horodatages. Un pour définir quand la commande a été créée (localement ou en ligne) et un quand elle a été enregistrée par le serveur.

Je ne recommande pas Message Queuing pour cela. J'ai utilisé MQ dans le passé pour un site Web de commerce électronique qui devait être connecté à Navision. Tout était géré au sein de Navision et les modifications envoyées au site Web de commerce électronique via MQ, y compris le statut des commandes et tout, y compris les descriptions de produits, les prix, etc. De nouvelles commandes ont également été envoyées à Navision via MQ.

Walter
la source
Hmmm, j'aime l'idée d'un modèle push, mais je vois le problème que si l'heure de l'ordinateur est modifiée, il peut y avoir une perte de données. BTW, j'ai la convention pour que chaque enregistrement soit horodaté dans mes conceptions de base de données. Pourquoi ne recommandez-vous pas MQ?
dukeofgaming
C'est vrai, vous devez utiliser des PC synchronisés en temps et UTC, mais c'est assez standard maintenant (au moins sous Windows). MQ est parfois nécessaire, mais je pense que ce serait trop pour le type d'application que vous développez.
Ok, donc afin de prioriser la fiabilité, il vaut mieux penser plutôt que l'application de bureau sera déconnectée et donc il vaut mieux traiter l'application de bureau comme un citoyen de première classe, cependant, j'ai toujours l'impression que MQ être un remplacement plus facile pour une implémentation de base de données locale. En outre, je pense que toutes les opérations CRUD sur le serveur implicitement ont une meilleure sécurité. Que pensez-vous de ces deux points?.
dukeofgaming
@dukeofgaming: dans mon cas, les commandes peuvent être prises à partir de n'importe quel point de vente (l'application peut également être utilisée comme système de prise de commandes et non comme système de traitement des commandes), y compris sur le Web. Tout a été distribué à travers le pays. Il était absolument nécessaire que chaque bureau soit autonome en cas de déconnexion. MQ fonctionnerait également dans ce scénario, donc je ne suis pas contre. Je pense simplement qu'il est plus facile de mettre en œuvre une synchronisation des données forte entre les serveurs maîtres et les clients. Par conséquent, l'opération CRUD sur le serveur maître n'était pas une option.
2
+1 - c'est ainsi que je l'ai vu faire dans le passé. Je dirais également que l'utilisation de l'identifiant unique (Guids) comme clés primaires simplifie énormément les choses. Faire cela est l'une de ces choses qui vous facilite vraiment la vie si vous avez besoin de synchronisation.
Scott Whitlock
1

Ou vous devriez regarder les implémentations de bases de données de systèmes connectés occasionnellement qui font le gros travail de synchronisation des clients distants avec le serveur. (SQL Server a cela avec SQL CE dans une certaine mesure, Outlook le fait).

De cette façon, vous pouvez effectuer toutes vos modifications localement dans une base de données à faible encombrement (il maintient le contrôle de version / les horodatages logiques, etc. afin que vous n'ayez pas à vous soucier des horloges PC, etc.) et chaque fois que vous vous connectez, vous le synchronisez avec le principal serveur.

Je n'irais pas pour une solution REST lorsque le système ne peut pas être en ligne la plupart du temps.

Subu Sankara Subramanian
la source
Décrivez-vous une base de données distribuée?, Pouvez-vous nous en dire plus?
dukeofgaming
Non - ce n'est pas une base de données distribuée au sens réel du terme. Une base de données distribuée s'attend généralement à ce que presque tout soit également en ligne, mais la logique de réplication parmi les pairs qui a baissé s'applique également ici. Il existe des bases de données de postes de travail / périphériques qui ont la possibilité d'effectuer le travail de réplication ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… ) - Donc, tout ce que vous avez à faire est de configurer cette base de données de périphériques, enregistrez vos modifications ici et lorsque vous vous connectez au réseau informatique, appelez la synchronisation - et cela fera le transfert de données vers le serveur principal pour vous.
Subu Sankara Subramanian