2008-08-13 10 views
2

Je suis en train de mettre en place un serveur de documents. Actuellement, si deux utilisateurs ouvrent le même document, puis le modifient et sauvegardent les changements, l'état du document sera indéfini (soit les modifications du premier utilisateur sont enregistrées de façon permanente, soit les secondes). Ceci est entièrement insatisfaisant. J'ai considéré deux possibilités pour résoudre ce problème:Serveur de document: gestion des sauvegardes simultanées

Le premier consiste à verrouiller le document lorsqu'il est ouvert par quelqu'un 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 resterait dans un état verrouillé à jamais. La solution évidente est d'envoyer des pings réguliers au serveur. Si le serveur ne reçoit pas de K ping d'affilée (K> 1), 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 a pas déjà verrouillés. Cela peut également aider si l'application cliente (exécutée dans le navigateur Web) est interrompue de façon inattendue, rendant 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 rapidement au document, le système propose soit de fusionner des versions, soit de sélectionner une version préférée. Pour optimiser l'espace de stockage, seules les différences de document doivent être conservées (tout comme les logiciels de contrôle de source).

Quelle méthode dois-je choisir, en prenant en compte que la connexion au serveur peut parfois être lente et ne pas répondre? Comment les paramètres (intervalle de ping, intervalle de succession rapide) doivent-ils être déterminés?

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

Répondre

0

Ma suggestion serait quelque chose comme votre premier. Lorsque le premier utilisateur (Bob) ouvre le document, il acquiert un verrou pour que les autres utilisateurs ne puissent lire que le document en cours. Si l'utilisateur enregistre le document pendant qu'il l'utilise, il garde le verrou. Seulement quand il quitte le document, il est déverrouillé et 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 peut le lire jusqu'à ce que le verrou soit libéré.

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

Comme vous l'avez dit vous-même, demander au client avec le verrou d'envoyer des pings à une certaine fréquence est probablement la meilleure option. Si vous n'obtenez pas de ping du client pendant un certain temps, cela signifie 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 maintenant 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.

1

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 grande partie de plusieurs facteurs, mais se résume essentiellement à la façon dont l'entreprise veut travailler. Par exemple, cela dérangerait-il indûment les utilisateurs si un document qu'ils devaient éditer était verrouillé par un autre utilisateur? Que se passe-t-il si un document est verrouillé et que quelqu'un part en vacances avec son client connecté? Quelle est la contention 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 localisées dans un seul document?(Si la même section est modifiée régulièrement, l'exécution d'une fusion peut prendre plus de temps que de simplement effectuer à nouveau les modifications). En supposant que la contention soit relativement faible et/ou que la taille de chaque changement soit relativement petite, j'opterais probablement pour un modèle optimiste qui résout les conflits en utilisant 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.

0

Actuellement, les documents sont publiés par un groupe limité de personnes, chacune travaillant sur un sujet distinct. Ainsi, l'inconvénient introduit par les verrous est minimisé. Les gens étendent principalement des documents existants et corrigent des erreurs dans ceux-ci. En parlant du modèle pessimiste, le scénario «client gauche connecté pour 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. Parce que les documents édités ne sont en aucun cas critiques pour la mission, et sont rarement modifiés par de nombreux utilisateurs, cela pourrait suffire.

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

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 de document, rôles utilisateur, etc.). À mon avis, les serrures sont plus avantageuses pour ce type d'information, car elles ne sont pas changées tous les jours. Donc, une solution hybride pourrait être acceptable.

Qu'en pensez-vous?

Questions connexes