Question

J'implémente un serveur de documents.Actuellement, si deux utilisateurs ouvrent le même document, puis le modifient et enregistrent les modifications, l'état du document sera indéfini (soit les modifications du premier utilisateur sont enregistrées définitivement, soit celles du second).Ceci est totalement insatisfaisant.J'ai envisagé deux possibilités pour résoudre ce problème :

La première consiste à verrouiller le document lorsqu’il est ouvert pour la première fois et à le déverrouiller lorsqu’il est fermé.Mais si la connexion réseau au serveur est soudainement interrompue, le document restera verrouillé à jamais.La solution évidente consiste à envoyer des pings réguliers au serveur.Si le serveur ne reçoit pas K pings consécutifs (K > 1) d'un client particulier, les documents verrouillés par ce client sont déverrouillés.Si ce client réapparaît, les documents sont à nouveau verrouillés, si quelqu'un ne les avait pas déjà verrouillés.Cela pourrait également être utile si l'application client (exécutée dans le navigateur Web) se termine de manière inattendue, ce qui rend impossible l'envoi d'un signal « quitter, déverrouiller mes documents » au serveur.

La seconde consiste à stocker plusieurs versions du même document enregistrées par différents utilisateurs.Si des modifications sont apportées au document en succession rapide, le système proposera soit de fusionner les versions, soit de sélectionner une version préférée.Pour optimiser l'espace de stockage, seuls les différences de documents doivent être conservées (tout comme les logiciels de contrôle de code source).

Quelle méthode dois-je choisir, en tenant compte du fait que la connexion au serveur peut parfois être lent et insensible ?Comment déterminer les paramètres (intervalle de ping, intervalle de succession rapide) ?

P.S.Malheureusement, je ne peux pas stocker les documents dans une base de données.

Était-ce utile?

La solution

Ma suggestion serait quelque chose comme votre première.Lorsque le premier utilisateur (Bob) ouvre le document, il acquiert un verrou afin que les autres utilisateurs ne puissent lire que le document en cours.Si l'utilisateur enregistre le document pendant qu'il l'utilise, il conserve le verrou.Ce n'est que lorsqu'il quitte le document que celui-ci est déverrouillé et que d'autres personnes peuvent le modifier.

Si le deuxième utilisateur (Kate) ouvre le document alors que Bob a le verrou dessus, Kate recevra un message indiquant que le document n'est pas modifiable mais elle pourra le lire jusqu'à ce que le verrou soit libéré.

Alors, que se passe-t-il lorsque Bob acquiert le verrou, enregistre peut-être le document une ou deux fois, puis quitte l'application en laissant le verrou suspendu ?

Comme vous l'avez dit vous-même, exiger que le client disposant du verrou envoie des pings à une certaine fréquence est probablement la meilleure option.Si vous ne recevez pas de ping du client pendant un laps de temps défini, cela signifie effectivement que son client ne répond plus.S'il s'agit d'une application Web, vous pouvez utiliser javascript pour les pings.Le dernier document enregistré libère son verrou et Kate peut désormais l'acquérir.

Un ping peut contenir le nom du document sur lequel le client a un verrou, et le serveur peut calculer quand le dernier ping pour ce document a été reçu.

Autres conseils

La première option que vous décrivez est essentiellement un modèle de verrouillage pessimiste tandis que la seconde est un modèle optimiste.Le choix dépend en réalité d’un certain nombre de facteurs, mais dépend essentiellement de la manière dont l’entreprise souhaite fonctionner.Par exemple, cela gênerait-il indûment les utilisateurs si un document qu'ils devaient modifier était verrouillé par un autre utilisateur ?Que se passe-t-il si un document est verrouillé et qu'une personne part en vacances avec son client connecté ?Quelle est la controverse probable pour chaque document - c'est-à-dire :Quelle est la probabilité que le même document soit modifié par deux utilisateurs en même temps ? Dans quelle mesure les modifications sont-elles susceptibles d'être localisées dans un seul document ?(Si la même section est modifiée régulièrement, effectuer une fusion peut prendre plus de temps que de simplement refaire les modifications).

En supposant que le conflit soit relativement faible et/ou que la taille de chaque changement soit assez petite, j'opterais probablement pour un modèle optimiste qui résout les conflits à l'aide d'une fusion automatique ou manuelle.Un numéro de version ou une somme de contrôle du contenu du document peut être utilisé pour déterminer si une fusion est requise.

Actuellement, les documents sont publiés par un groupe limité de personnes, chacune travaillant sur un sujet distinct.Ainsi, les désagréments introduits par les verrous sont minimisés.Les gens étendent principalement les documents existants et corrigent les erreurs qu'ils contiennent.

En parlant du modèle pessimiste, le scénario « laisser le client connecté pendant N jours » pourrait être évité en définissant la date d'expiration du verrouillage, par exemple, un jour avant la date de début du verrouillage.Étant donné que les documents édités ne sont en aucun cas essentiels à la mission et sont assez rarement modifiés par plusieurs utilisateurs, cela pourrait suffire.

Considérons maintenant le modèle optimiste.Comment les différences doivent-elles être détectées si les documents ont une structure régulière (disons hiérarchique) ?Sinon?Quelles sont les chances de réussite d’une fusion automatique dans ces cas-là ?

La situation devient plus compliquée, car certains documents (édités par le groupe d'utilisateurs 'admins') contiennent des informations de configuration importantes (index global du document, rôles des utilisateurs, etc.).À mon avis, les verrous sont plus avantageux précisément pour ce type d'informations, car ils ne sont pas modifiés quotidiennement.Une solution hybride pourrait donc être acceptable.

Qu'en penses-tu?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top