Synchronisation avec le système hors ligne

9

Je conçois un système à partir duquel je synchroniserai les données d'entreprise à partir de l'appareil mobile (qui a une application intégrée) qui génère des données et les renvoie au serveur. Chaque ligne synchronisée génère un journal d'entreprise spécifique dans la base de données.

Si ce que je synchronise génère des données avec une date (dans les données de synchronisation) inférieure à la dernière date de modification de mes données d'entreprise, je dois l'ignorer et ajouter simplement la base de données de connexion. Une fois les données téléchargées traitées, les données sont extraites de la base de données et téléchargées sur l'appareil.

En raison de ce téléchargement juste après l'écriture, la synchronisation doit être synchrone. Il est toujours possible d'avoir un modèle de lecteur / écrivain si quelque chose comme ça vaut suffisamment pour remplacer ma solution existante. Le plus important est de pouvoir télécharger des données à jour. Ces données sont récupérées dans leur ensemble, il n'y a pas de différence implémentée pour le moment (cela peut venir plus tard mais ce ne sera pas un problème).

Je peux avoir plusieurs synchronisations sur le même objet métier en cours d'exécution, c'est peu probable mais cela peut arriver et je préfère pouvoir le gérer. La synchronisation devrait durer quelques secondes mais pas quelques minutes, à moins d'utiliser l'application mobile intégrée sans resynchronisation pendant quelques jours.

Le volume de données synchronisées ne devrait pas être important, ni le processus de synchronisation.

Donc, je finis par utiliser une exclusion mutuelle sur ma méthode de synchronisation, plus précisément, j'utilise Java et je mets une synchronisation sur la méthode d'écriture et non tout le processus de synchronisation pour ne pas bloquer la synchronisation en lecture seule.

J'aimerais savoir :

  1. Si cela a du sens? Tant que le volume et la durée du processus de synchronisation sont toujours acceptables.
  2. De manière générale, quels concepts dois-je examiner. Bonus: s'il y a une implémentation de ces concepts dans un module Spring.
Walfrat
la source
Qu'est-ce qui cause le hors ligne? Je veux dire que lorsque l'appareil est hors ligne, cela signifie qu'il n'a pas accès uniquement au serveur ou qu'il n'a pas accès à Internet non plus?
Laiv
Il n'a pas accès à Internet. Ou pas souvent.
Walfrat
Si vous avez plusieurs clients / serveurs synchronisés, vous devez d'abord décider de la maîtrise des données au cas où quelque chose différerait. Si vous ne considérez que les connexions intermittentes et les clients multiples, il n'y a certainement aucun moyen de le faire progressivement.
tofro
La maîtrise des données @tofro est facile à déterminer dans mon cas, donc ce n'est pas un problème. Mais pourquoi ne serait-il pas possible de le faire progressivement avec des connexions intermittentes? Ne devrais-je pas pouvoir simplement utiliser une dernière date de synchronisation? Le seul problème dans mon cas en utilisant une telle date serait de savoir qu'une donnée qui se trouve actuellement sur mon appareil a été déplacée et doit être supprimée sur l'appareil.
Walfrat
D'après votre description, j'ai compris que la même donnée peut être modifiée sur le serveur, ou sur un ou plusieurs clients multiples. Comment synchroniser à trois un élément de données qui est allé au mobile # 1, puis a été modifié sur le serveur, puis est allé au mobile # 2 et a été modifié là-bas, puis le mobile # 1 se connecte (avec un mobile # 2 déconnecté)?
tofro

Réponses:

1

Une approche que j'étudie depuis un certain temps (avec un certain succès) pour synchroniser les données client avec les données du serveur, sans s'appuyer sur des dates (qui pourraient ne pas être fiables) ou des demandes synchrones, est une combinaison de correctifs JSON (peut-être des POJO s dans votre cas) et la recherche d' événements .

L'idée de base est qu'au lieu de stocker l'état actuel sur le client et le serveur, le client et le serveur stockent une liste de modifications et se communiquent par le biais d'événements ou de demandes de correctifs.

Ainsi, au lieu de demander au client d'envoyer toutes les données plus une date au serveur, le client envoie un événement, ainsi qu'un numéro de révision qui correspond à la dernière fois que le client pense que les données ont été mises à jour. Quelque chose comme ça:

Server.send("MODIFY FOO", 3);

Une fois que le serveur obtient cet événement (de manière asynchrone), il le réconcilie avec les autres événements qu'il a peut-être déjà reçus. Par exemple, il est possible qu'un autre client travaillant avec les mêmes données ait déjà modifié certaines choses, et maintenant le numéro de révision sur le serveur est à 5. Ainsi, cette révision devra être appliquée avant que les 2 dernières aient été appliquées, et tous les clients devront être informés de ce changement.

Une fois le serveur terminé, il informe tous les clients intéressés des modifications apportées et du nouveau numéro de révision actuel. Le client applique ensuite ces modifications et met à jour son numéro de révision interne.

Votre kilométrage peut varier, mais j'espère que cela vous aidera.

Modifier: un autre nom de cette approche, ou une variante de celle-ci, est appelé mise en file d'attente des messages , comme mentionné dans cette question connexe .

Jeffrey Sweeney
la source
Le système peut être hors ligne (pas d'accès au serveur) pendant quelques jours et doit enregistrer la date à laquelle l'événement s'est produit, et non pas quand l'événement a été synchronisé avec le serveur. C'est pourquoi je dois utiliser des dates. J'ai également un numéro de révision pour optimisticLocking, mais pour la même raison, 2 appareils peuvent télécharger la version X d'un POJO et lorsqu'ils se synchronisent plus tard, chaque envoi d'événements doit générer une version X + 1 et X + 2. Et les appareils ne peuvent pas communiquer entre eux.
Walfrat
Le numéro de révision dans cette réponse est toujours généré sur le serveur, le client envoie les anciens numéros de révision, il n'a pas besoin de connaître les autres clients car l'incrément de révision n'est pas de sa responsabilité. Cette réponse ne mentionne pas la résolution des conflits, qui est la partie la plus importante de la solution proposée.
Basilevs
0

Le premier problème est d'utiliser les dates comme moyen de synchroniser les données. Je suis vraiment sûr de ne pas avoir obtenu tous les détails de votre solution, mais je dirais que:

  1. Les dates sont-elles générées sur les mobiles? Dans ce cas, êtes-vous sûr que l'application exécutée sur les mobiles utilisera toujours les dates correctes? Qu'en est-il d'un utilisateur malveillant qui peut quelque peu modifier la date du système sur son appareil mobile? Qu'en est-il des utilisateurs dans différents fuseaux horaires? Comme @jeffrey vous l'a dit, ce n'est peut-être pas la meilleure approche pour s'appuyer sur les dates générées sur les appareils.

  2. Si j'ai bien compris, vous utilisez le contrôle de concurrence optimiste . Je ne vois rien qui soit intrinsèquement mauvais dans votre approche.

  3. Cette question concerne l'implémentation du verrouillage optimiste au printemps . Vous pouvez peut-être y trouver de l'inspiration.

danidemi
la source
Je dois enregistrer la date à laquelle l'action a été exécutée, en tant que tel, je suis coincé avec la date du mobile. La date mobile est fréquemment resynchronisée avec le système. Seuls les appareils enregistrés peuvent se synchroniser avec le serveur. Quant à la sécurité, c'est une autre préoccupation qui reste pour l'instant (authentification des appareils X509, ...)
Walfrat
La date peut être enregistrée comme un autre champ de données, pas besoin de la traiter comme un jeton de synchronisation.
Basilevs