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 :
- Si cela a du sens? Tant que le volume et la durée du processus de synchronisation sont toujours acceptables.
- 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.
la source
Réponses:
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:
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 .
la source
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:
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.
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.
Cette question concerne l'implémentation du verrouillage optimiste au printemps . Vous pouvez peut-être y trouver de l'inspiration.
la source