web-dev-qa-db-fra.com

Résolution des conflits pour la synchronisation bidirectionnelle

Comment gérez-vous la synchronisation bidirectionnelle entre un serveur de base de données "principal" et de nombreux serveurs "secondaires", en particulier la résolution des conflits, en supposant qu'une connexion n'est pas toujours disponible?

Par exemple, j'ai une application mobile qui utilise CoreData comme "base de données" sur iOS et j'aimerais permettre aux utilisateurs de modifier le contenu sans connexion Internet. Dans le même temps, ces informations sont disponibles sur un site Web auquel les appareils se connecteront. Que dois-je faire si/lorsque les données sur les deux serveurs DB sont en conflit?
(Je me réfère à CoreData en tant que serveur de base de données, bien que je sache que c'est quelque chose de légèrement différent.)

Existe-t-il des stratégies générales pour traiter ce type de problème? Voici les options auxquelles je peux penser:
1. Utilisez toujours les données côté client en priorité
2. Idem côté serveur
3. Essayez de résoudre les conflits en marquant l'horodatage de modification de chaque champ et en effectuant la dernière modification

Bien que je sois certain que la 3ème option ouvrira la place à une corruption de données dévastatrice.

Je suis conscient que le théorème de la PAC concerne cela, mais je veux seulement une cohérence éventuelle, donc il ne l'exclut pas complètement, non?

Question connexe: Modèles de meilleures pratiques pour la synchronisation bidirectionnelle des données . La deuxième réponse à cette question dit que cela ne peut probablement pas être fait.

24
K.Steff

La solution habituelle pour savoir "quel changement est correct" est un horloge vectorielle . Vous gardez essentiellement des compteurs pour chaque référentiel qui contient les données et rejetez les modifications si la vue d'un client particulier de l'état de chacun diffère de celle de l'homologue auquel il se connecte.

La grande question à laquelle vous devez répondre est de savoir comment vous allez résoudre les sauvegardes rejetées. Cela signifie généralement une sorte d'opération de fusion.

Notez que les horloges vectorielles n'utilisent pas des horodatages en temps réel. Les problèmes liés à la synchronisation des horloges en temps réel sont au moins aussi difficiles que la synchronisation des données.

14
parsifal

C'est le problème Byzantine Generals , qui est insoluble. Vous ne pouvez jamais garantir synchroniser les deux serveurs si vous ne pouvez pas garantir que à un moment donné dans le futur , vous disposerez d'une bande passante fiable suffisante pour effectuer la synchronisation en une seule fois.

10
DeadMG

Je suppose qu'il n'y a pas de moyen standard de le faire, chaque système utilise ses propres politiques pour la résolution des conflits.

J'ai fait quelques simulations en utilisant deux appareils, un ordinateur et un téléphone, et une feuille de calcul Google pour vérifier comment Google Docs gère les conflits automatiquement. Voici quelques cas:

Cas 1

  1. L'ordinateur et le téléphone sont hors ligne
  2. Ordinateur modifier la cellule avec la valeur "ordinateur" et après le téléphone modifier la cellule avec la valeur "téléphone"
  3. L'ordinateur devient en ligne
  4. Le téléphone devient en ligne et l'ordinateur et le téléphone affichent "téléphone".

Cas 2

  1. L'ordinateur et le téléphone sont hors ligne
  2. Ordinateur modifier la cellule avec la valeur "ordinateur" et après le téléphone modifier la cellule avec la valeur "téléphone"
  3. Le téléphone devient en ligne
  4. L'ordinateur devient en ligne et l'ordinateur et le téléphone affichent "ordinateur".

Ainsi, au moins le serveur Google Docs utilise les dernières données qu'il a reçues en priorité supérieure indépendamment de la date de sa création (horodatage du client). J'ai également testé s'ils effectuent une synchronisation en arrière-plan, et apparemment ils ne le font pas, donc le résultat de la résolution des conflits est transparent pour l'utilisateur.

GIT, d'autre part, ne gère pas les conflits automatiquement, mais délègue à la place au dernier utilisateur qui tentait de modifier le référentiel comment la fusion devrait être effectuée.

J'opterais pour l'approche Google Docs si la synchronisation est correcte uniquement au premier plan, l'utilisateur visualisant les données. Sinon, un utilisateur peut être surpris que, tandis que son téléphone se connecte automatiquement à un réseau Wi-Fi, un changement non synchronisé vers une réunion qu'il a ensuite réédité sur son PC soit mis en ligne.

J'opterais pour l'approche d'horodatage client, en remplaçant les conflits avec la dernière modification, si vous avez besoin d'une synchronisation en arrière-plan, je peux faire confiance à l'horodatage client et le coût d'une fusion indésirable est inférieur au coût de demander à l'utilisateur de choisir la version qu'il souhaite garder.

Sinon, j'opterais pour l'approche GIT, en affichant une fenêtre contextuelle dans le prochain client au premier plan, demandant à l'utilisateur de choisir la version à conserver ou en donnant la possibilité de revenir sur la fusion.

1
Allan Veloso