Modèle / algorithme de synchronisation client-serveur?

J’ai l’impression qu’il doit y avoir des schémas de synchronisation client-serveur. Mais je n’ai pas réussi à en créer un.

La situation est assez simple: le serveur est le nœud central, auquel plusieurs clients se connectent et manipulent les mêmes données. Les données peuvent être divisées en atomes, en cas de conflit, quel que soit le serveur, elles ont la priorité (pour éviter que l’utilisateur ne soit en conflit). La synchronisation partielle est préférable en raison des quantités de données potentiellement importantes.

Existe-t-il des modèles / bonnes pratiques pour une telle situation ou, si vous n’en connaissez pas, quelle serait votre approche?

Voici comment je pense maintenant pour le résoudre: Parallèlement aux données, un journal de modifications sera tenu, avec toutes les transactions horodatées. Lorsque le client se connecte, il reçoit toutes les modifications depuis la dernière vérification, sous forme consolidée (le serveur parcourt les listes et supprime les ajouts suivis de suppressions, fusionne les mises à jour pour chaque atome, etc.). Et voilà, nous sums à jour.

Alternative conserverait la date de modification pour chaque enregistrement et, au lieu d’effectuer des suppressions de données, marquez-les simplement comme supprimées.

Des pensées?

Vous devriez regarder comment fonctionne la gestion des changements dissortingbués. Regardez SVN, CVS et d’autres référentiels qui gèrent le travail des deltas.

Vous avez plusieurs cas d’utilisation.

  • Synchroniser les modifications Votre approche de changement de journal (ou historique de delta) semble bonne pour cela. Les clients envoient leurs deltas au serveur. Le serveur consolide et dissortingbue les deltas aux clients. C’est le cas typique. Les bases de données appellent cette “réplication de transaction”.

  • Le client a perdu la synchronisation. Soit par une sauvegarde / restauration ou à cause d’un bogue. Dans ce cas, le client doit obtenir l’état actuel du serveur sans passer par les deltas. Ceci est une copie du maître au détail, les deltas et la performance soient damnés. C’est une chose unique; le client est cassé; n’essayez pas de l’optimiser, implémentez simplement une copie fiable.

  • Le client est suspect. Dans ce cas, vous devez comparer le client au serveur pour déterminer si le client est à jour et a besoin de deltas.

Vous devez suivre le modèle de conception de firebase database (et de SVN) en numérotant séquentiellement chaque modification. De cette façon, un client peut faire une requête sortingviale (“Quelle révision dois-je avoir?”) Avant de tenter de synchroniser. Et même dans ce cas, la requête (“Tous les deltas depuis 2149”) est extrêmement simple à traiter pour le client et le serveur.

Ce dont vous avez vraiment besoin est la transformation opérationnelle (OT). Cela peut même répondre aux conflits dans de nombreux cas.

C’est encore un domaine de recherche actif, mais il existe des implémentations de divers algorithmes d’OT. Je suis impliqué dans de telles recherches depuis plusieurs années maintenant, alors laissez-moi savoir si cette voie vous intéresse et je serai heureux de vous mettre sur des ressources pertinentes.

En tant que membre de l’équipe, j’ai fait pas mal de projets impliquant la synchronisation des données, alors je devrais être compétent pour répondre à cette question.

La synchronisation des données est un concept assez large et il y a beaucoup trop de choses à discuter. Il couvre une gamme d’approches différentes avec leurs avantages et inconvénients. Voici l’une des classifications possibles basées sur deux outlook: synchrone / asynchrone, client / serveur / homologue. L’implémentation de la synchronisation dépend fortement de ces facteurs, de la complexité du modèle de données, de la quantité de données transférées et stockées et d’autres exigences. Donc, dans chaque cas particulier, le choix devrait être en faveur d’une implémentation la plus simple répondant aux exigences de l’application.

Sur la base d’un examen des solutions existantes, nous pouvons définir plusieurs grandes classes de synchronisation, dont la granularité des objects soumis à la synchronisation est différente:

  • La synchronisation d’un document entier ou d’une firebase database est utilisée dans des applications basées sur le cloud, telles que Dropbox, Google Drive ou Yandex.Disk. Lorsque l’utilisateur modifie et enregistre un fichier, la nouvelle version du fichier est téléchargée sur le nuage, remplaçant la copie antérieure. En cas de conflit, les deux versions du fichier sont enregistrées afin que l’utilisateur puisse choisir la version la plus pertinente.
  • La synchronisation des paires clé-valeur peut être utilisée dans les applications avec une structure de données simple, où les variables sont considérées comme étant atomiques, c’est-à-dire non divisées en composants logiques. Cette option est similaire à la synchronisation de documents entiers, car la valeur et le document peuvent être complètement remplacés. Cependant, du sharepoint vue de l’utilisateur, un document est un object complexe composé de nombreuses parties, mais une paire clé-valeur n’est qu’une chaîne courte ou un nombre. Par conséquent, dans ce cas, nous pouvons utiliser une stratégie plus simple de résolution des conflits, considérant que la valeur est plus pertinente si elle a été la dernière à changer.
  • La synchronisation des données structurées sous forme d’arborescence ou de graphique est utilisée dans des applications plus sophistiquées où la quantité de données est suffisamment importante pour envoyer la firebase database dans son intégralité à chaque mise à jour. Dans ce cas, les conflits doivent être résolus au niveau des objects, des champs ou des relations individuels. Nous nous concentrons principalement sur cette option.

Nous avons donc saisi nos connaissances dans cet article qui, à mon avis, pourrait être très utile à tous ceux qui s’intéressent au sujet => Synchronisation des données dans les applications iOS basées sur les données de base ( http://blog.denivip.ru/index.php/2014/04 / data-synchronisation-dans-core-data-based-ios-apps /? lang = fr )

La question n’est pas claire, mais je regarderais avec optimisme si j’étais toi. Il peut être implémenté avec un numéro de séquence que le serveur renvoie pour chaque enregistrement. Lorsqu’un client tente de sauvegarder l’enregistrement, il inclura le numéro de séquence qu’il a reçu du serveur. Si le numéro de séquence correspond à celui de la firebase database au moment où la mise à jour est reçue, la mise à jour est autorisée et le numéro de séquence est incrémenté. Si les numéros de séquence ne correspondent pas, la mise à jour est interdite.

Pour la synchronisation delta (changement), vous pouvez utiliser le modèle pubsub pour publier les modifications sur tous les clients abonnés, des services comme pusher peuvent le faire.

Pour les miroirs de firebase database, certains frameworks Web utilisent une mini-firebase database locale pour synchroniser la firebase database côté serveur avec la firebase database locale du navigateur, la synchronisation partielle étant prise en charge. Vérifiez le compteur .