2008-11-29 4 views
12

J'ai un problème de synchronisation assez simple. J'ai une table avec environ 10 colonnes que je veux garder en synchronisation entre un fichier sqlite sur 3 clients différents: un client Iphone, un client de navigation, et un client Ruby on Rails. J'ai donc besoin d'une solution de sycing simple qui fonctionnera pour tous les 3, c'est-à-dire que je peux facilement l'implémenter dans Javascript, Objective C et Ruby et cela fonctionne avec JSON sur HTTP. J'ai examiné divers composants d'autres solutions de synchronisation comme celui de git, certains tutoriels issus de la communauté Google Gears et un plugin rails appelé acts_as_replica. Mon approche naïve consiste simplement à créer un dernier horodatage synchronisé dans la base de données, puis à créer un journal des modifications de toutes les suppressions au fur et à mesure. (Je n'autorise pas les mises à jour des entrées dans la table). Je peux alors récupérer toutes les nouvelles entrées depuis le dernier horodatage, combiner ensuite avec les suppressions, et envoyer un changelog comme json sur http entre les 3 solutions.Quelle est la meilleure façon de synchroniser 2 tables sqlite sur http et json?

Devrais-je considérer l'utilisation du hachage SHA1 ou d'un UUID de chaque entrée ou est-ce qu'un dernier horodatage synchronisé est suffisant? Comment puis-je m'assurer qu'il n'y a pas d'entrées en double? Y a-t-il un algorithme plus simple que je pourrais suivre?

Répondre

2

Je suppose que les changements sont susceptibles d'être à la fin. Je ne connais pas le caractère de l'insertion et des mises à jour mais voici mon idée;

  • Je voudrais SHA1 (ou MD5, ce n'est pas grave dans ce cas) jours du mois en cours et mois avant. La comparaison avec ces empreintes digitales est un moyen rapide de voir si les différences sont. (Je pars aujourd'hui sans être inquiété)
  • Si les mois précédents ont des différences; Si le volume d'un mois est trop important, nous pouvons alors diviser le mois et générer simplement des empreintes digitales à la volée au lieu de comparer le mois entier.
  • Sinon, nous pouvons traiter un changement mensuel de la même manière que nous traitons un changement quotidien. Après avoir découvert où les changements se produisent, la copie principale enverrait une liste de tous les identifiants uniques pour cette période. (Toujours envoyer l'info du jour)
  • L'esclave supprime alors ce qui doit être supprimé et compile une liste d'identifiants à insérer.
  • Le maître envoie uniquement ces enregistrements (en totalité).

Les catégories de temps (jour, mois) peuvent être ajustées en fonction du volume de données.

Bien sûr, il s'agit d'un algorithme naïf et simple. Si je traitais des données sensibles/critiques, je rechercherais un algorithme transactional.

Questions connexes