51 votes

Quelle est l’approche la plus intelligente et la plus facile pour synchroniser des données entre plusieurs entités?

Aujourd'hui, dans le monde où un grand nombre d'ordinateurs, les appareils mobiles ou de services web, partager des données ou d'agir comme les hubs, la synchronisation devient de plus en plus important. Comme nous le savons tous, des solutions de synchronisation ne sont pas les plus confortables et il est préférable de ne pas synchroniser à tous.

Je suis toujours curieux de savoir comment vous mettre en œuvre une solution de synchronisation pour la synchronisation entre plusieurs entités. Il y a déjà beaucoup de différentes approches, comme comparer un changement de champ de date ou d'un hachage et en utilisant les données les plus récentes ou permettant à l'utilisateur de choisir ce qu'il souhaite utiliser dans un cas de conflit. Une autre approche est d'essayer de fusionner automatiquement en conflit données (qui à mon avis n'est pas si intelligent, parce qu'une machine ne peut pas deviner ce qu'a voulu dire l'utilisateur).

De toute façon, ici sont un couple de questions liées à la synchronisation que nous devons répondre avant de commencer à mettre en œuvre la synchronisation:

  • Qu'est-ce que les données les plus récentes? Comment puis-je tiens à le représenter?
  • Que dois-je faire en cas de conflit? Fusion? Dois-je l'invite et demander à l'utilisateur ce qu'il doit faire?
  • Que dois-je faire quand je suis dans un état incohérent (par exemple, un décalage en raison d'une pâte connexion au réseau mobile)?
  • Que dois-je faire lorsque je ne veux pas entrer dans un état incohérent?
  • Comment puis-je reprendre une synchronisation actuel qui s'est interrompu?
  • Comment puis-je gérer le stockage de données (par exemple, base de données MySQL sur un service web, Base de Données sur un iPhone; et comment dois-je les fusionner ou de synchronisation de données sans beaucoup de colle de code)?
  • Comment puis-je gérer les modifications de l'utilisateur qui se produisent lors de la synchronisation (qui s'exécute en arrière-plan, de sorte que l'INTERFACE utilisateur n'est pas bloqué)?
  • Comment et dans quelle direction dois-je propager les modifications (par exemple, un utilisateur crée un "Foo" entrée sur son ordinateur et n'a pas de synchronisation; puis il est sur la route et crée un autre "Foo" entrée; ce qui arrive quand il essaie de synchroniser les deux appareils)? L'utilisateur a deux "Foo" entrées avec différents Identifiants uniques? L'utilisateur ont une seule entrée, mais lequel?
  • Comment dois-je gérer la synchronisation lorsque j'ai des données hiérarchiques? De haut en bas? Bottom-up? Dois-je traiter chaque entrée automatiquement ou dois-je seulement regarder un supernœud? Quelle est la taille du trade-off entre trop simplifier les choses et d'investir trop de temps dans la mise en œuvre?
  • ...

Il y a beaucoup de questions, et j'espère que je pourrais vous inspirer assez. La synchronisation est plutôt un problème général. Une fois un bon, polyvalent synchronisation approche est trouvé, il devrait être plus facile de l'appliquer à une application concrète, plutôt que de commencer à penser à partir de zéro. Je me rends compte qu'il y a déjà beaucoup de demandes que d'essayer de résoudre (ou de résoudre avec succès) la synchronisation, mais ils sont déjà assez spécifiques et ne donnent pas assez de réponses à la synchronisation des approches en général.

55voto

GaZ Points 1054

Où je travaille, nous avons développé un "hors ligne" version de notre principal (web) application pour les utilisateurs d'être en mesure de travailler sur leurs ordinateurs portables dans des endroits où ils n'ont pas accès à internet (je ne suis pas sûr de savoir comment beaucoup de ces endroits existent réellement ces jours-ci, mais j'ai dit qu'ils font ;)). Lorsque l'utilisateur revient sur le site principal dont ils ont besoin pour synchroniser les données entrées en mode hors connexion avec notre application principale.

Donc, pour répondre à vos questions:

  • Qu'est-ce que les données les plus récentes? Comment puis-je tiens à le représenter?

Nous avons un LAST_UPDATED_DATE colonne sur chaque table. Le serveur conserve une trace de quand synchronisations prendre place, de sorte que lors de l'application hors ligne demande une synchronisation du serveur dit "hé, ne me donne que les données modifiées depuis cette date".

  • Que dois-je faire en cas de conflit? Fusion? Dois-je l'invite et demander l'utilisateur ce qu'il doit faire?

Dans notre cas, l'application hors connexion n'est en mesure de mettre à jour un sous-groupe relativement petit de toutes les données. Chaque dossier est synchronisé, nous vérifions si c'est un de ces cas, et si oui, puis on compare les LAST_UPDATED_DATE pour l'enregistrer à la fois en ligne et hors ligne. Si les dates sont différentes, nous aussi vérifier les valeurs (parce que ce n'est pas un conflit si elles sont toutes les deux mises à jour à la même valeur). Si il y a un conflit, nous enregistrons la différence, définir un indicateur pour dire qu'il y a au moins un conflit, et portent sur la vérification de la reste des détails. Une fois le processus terminé, puis si le "isConflict" indicateur est défini, l'utilisateur est capable d'aller à une page qui affiche les différences et de décider lesquels des données est la "bonne" version. Cette version est ensuite enregistré sur l'ordinateur hôte et le "isConflict" drapeau est remis à zéro.

  • Que dois-je faire lorsque je ne veux pas entrer dans une incohérent de l'état?
  • Comment puis-je reprendre une synchronisation actuel qui s'est interrompu?

Eh bien, nous essayons d'éviter d'entrer dans un état incohérent dans la première place. Si un synchronistaion est interrompue pour une raison quelconque, l'last_synchronisation_date n'est pas mis à jour, et donc, la prochaine fois qu'une synchronisation est lancé, il va commencer à partir de la même date que la date de début de la précédente (interrompu) synchronisation.

  • Comment puis-je gérer le stockage de données (par exemple, base de données MySQL sur un service web, de Base Les données sur un iPhone; et comment puis-je de fusion/synchroniser les données, sans beaucoup de colle le code)?

Nous utilisons des bases de données standard sur les deux applications, et des objets Java dans entre. Les objets sont sérialisé en XML (et au format gzip pour accélérer le transfert) pour le processus de synchronisation, puis décompressé/deserialised à chaque extrémité.

  • Comment puis-je gérer les modifications de l'utilisateur qui se produisent lors de la synchronisation (qui s'exécute en arrière-plan, de sorte que le L'INTERFACE utilisateur n'est pas bloqué)?

Ces modifications auraient lieu après la synchronisation de la date de début, et donc ne serait pas ramassé sur l'autre côté jusqu'à la prochaine synchronisation.

  • Comment et dans quelle direction dois-je propager les modifications (par exemple, un utilisateur crée un "Foo" entrée sur son ordinateur et ne synchronise pas; alors il est sur la route et crée un autre "Foo" entrée; ce qui se passe quand il essaie de synchroniser les deux les appareils)? L'utilisateur a deux "Foo" entrées avec différents Identifiants uniques? L'utilisateur ont une seule entrée, mais lequel?

C'est à vous de décider comment vous voulez gérer cette Foo... c'est à dire en fonction de ce que la clé primaire de Foo est et comment déterminer si un Foo est le même que l'autre.

  • Comment dois-je gérer la synchronisation lorsque j'ai des données hiérarchiques? De haut en bas? Bottom-up? Dois-je traiter chaque entrée atomiquement ou ne puis-je regarder un supernode?

La synchronisation est atomique, donc si un enregistrement échoue, alors l'ensemble du processus est marqué comme incomplète, semblable à une subversion commit de la transaction.

  • Quelle est la taille du trade-off entre trop simplifier les choses et d'investissement trop de temps dans la mise en œuvre?

Je ne suis pas sûr exactement ce que tu veux dire, mais je dirais que tout dépend de votre situation et du type et de la quantité de données que vous souhaitez synchroniser. Il pourrait prendre un certain temps pour concevoir et mettre en œuvre le processus, mais c'est possible.

Espère que vous aide ou au moins vous donne quelques idées! :)

5voto

Thilo Points 108673

Sans doute n'est Pas "une vraie question", ici, n'est pas une vraie réponse:

Je pense distribués, systèmes de contrôle de version (comme Mercurial ou git) ont trouvé une grande partie de cela. Cependant, ils exigent que les gens acceptent qu'il peut y avoir plus d'une "dernière" version, et que, parfois contradictoires, les mises à jour de la résolution manuelle à résoudre. Aussi, si vous n'êtes pas intéressé à garder l'ensemble de l'historique des modifications, il est tout à fait un peu de surcharge dans ces systèmes (mais bien sûr, l'histoire récente est nécessaire de trouver des ancêtres communs pour déterminer comment les deux versions se rapportent).

Mais je suis d'accord avec vous que, dans un monde où tout le monde a des données réparties sur plusieurs appareils et services, de la nécessité de conserver automatiquement un suivi et de distribuer les mises à jour deviennent donc urgent que les formats de fichiers communs utilisés par les applications comprennent un nombre suffisant de méta-données afin de faciliter une sorte de intelligent de la fusion de comportement. Mais ce comportement sera sans doute arriver sur le niveau de l'application, car il n'existe pas de méthode générique permettant de régler les divergences mises à jour.

Dans le temps moyen, le iTunes-iPod approche est la plus facile: Vous n'avez qu'un maître de la bibliothèque, et chaque dispositif tire de là. De toute évidence, un seul maître-sync n'est pas très satisfaisant dans tous les scénarios (en particulier lorsque plus d'un utilisateur est impliqué), mais encore, je l'apprécierais si plus de demandes offert la possibilité de travailler comme ça (bête noire: j'ai trois Mac, avec trois iPhoto installations. Si ils synchronisés automatiquement à partir d'un maître dévoué, tout comme les photos de synchronisation de mon iPod, ce serait une amélioration).

0voto

Rafael Points 606

Merci pour la réponse détaillée de GaZ. J'ai un couple de questions de suivi:

Si vous utilisez des horodateurs, comment gérez-vous inexacte des paramètres de temps (de petites différences, par exemple 1 à 5 secondes)? Comment souvent ils apparaissent? N'est-ce pas un contrôle de version (comme SVN t-il) de mieux pour le traitement des différents changements de données?

Je comprends que vous ne récupérer des données entre deux horodatages, les last_synchronisation_date (par client) et maintenant?

Que faites-vous quand un utilisateur n'a pas à résoudre les conflits? N'avez-vous pas de synchronisation de données qui est marqué avec l'isConflict drapeau ou avez-vous d'ajouter un autre conflit, de sorte que l'utilisateur peut choisir entre plus de deux versions d'une entité lorsqu'il décide de résoudre tous les conflits? Ou n'avez-vous pas de synchronisation à tous si il y a certaines données marqués comme étant en conflit?

0voto

fravelgue Points 1119

Bien que cela soit vraiment utile dans l'écosystème Microsoft, vous pouvez étudier les blocs d'applications mobiles .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X