Comment gérez-vous plusieurs utilisateurs qui modifient le même élément de données dans une webapp?

26

Il y a un projet sur lequel je travaille qui cherche à produire une application Web qui gérera une liste de tâches entre plusieurs utilisateurs. Il s'agit d'une liste de tâches principale dont les éléments de tâche sont distribués par un utilisateur autorisé. Chaque utilisateur a son propre compte pour se connecter et voir les tâches qui lui sont assignées; il est possible pour plusieurs utilisateurs d'avoir une seule tâche en commun.

J'essaie de laisser les détails du projet en dehors de cela car je m'attaque davantage au concept global de la façon de gérer les situations suivantes, mais si cela aide, j'utilise Java, EclipseLink et GWT avec RequestFactory implémenté. La base de données est PostgreSQL.

Les problèmes conceptuels que j'essaie de concilier sont donc les suivants:

  1. Si une seule tâche commune à plusieurs utilisateurs change de quelque manière que ce soit, par exemple une tâche terminée, supprimée, etc., la liste des tâches de tous les utilisateurs qui ont cette tâche sera mise à jour. Quels sont les modèles de conception qui aident à mettre en œuvre cette fonction?

    • Certains modèles que j'ai examinés sont Observateur et Médiateur - y en a-t-il d'autres qui devraient être pris en compte par rapport à ceux-ci?
  2. Supposons que deux utilisateurs modifient la même tâche en même temps.

    • Premièrement, dois-je permettre que cette situation se produise ou dois-je mettre un verrou dessus jusqu'à ce que l'une ou l'autre personne ait fait des changements?

    • Deuxièmement, si je ne mets pas de verrou dessus, comment puis-je concilier les modifications à accepter? Cela implique la situation en 1 car l'utilisateur 1 pourrait soumettre les données et avant que l'utilisateur 2 ne reçoive les données mises à jour, il / elle peut avoir avancé et soumis ses modifications.

Je suis vraiment à la recherche de points de repère, de conseils ou de conseils que vous pouvez fournir sur la façon de synchroniser correctement les données entre plusieurs instances de cette application Web. Je l'apprécierais beaucoup!

hulkmeister
la source

Réponses:

17

Je pense que le tableau blanc sera votre modèle de choix pour le n ° 1, vous devez publier les modifications des tâches (ou d'autres données partagées) dans un endroit commun, afin que toutes les parties intéressées puissent les voir et DTRT.

Pour # 2, vous devez regarder le verrouillage optimiste . Fondamentalement, vous devez horodater tous vos enregistrements modifiables avec l'heure de la dernière mise à jour. Lorsque vous essayez de sauvegarder l'enregistrement, vous vérifiez d'abord que l'enregistrement dans la base de données a le même horodatage mis à jour en dernier que votre enregistrement. Sinon, quelqu'un a mis à jour l'enregistrement et vous devez maintenant obtenir l'enregistrement mis à jour et informer l'utilisateur qu'il doit saisir à nouveau ses modifications, ou vous pouvez essayer de fusionner les modifications de l'utilisateur dans l'enregistrement mis à jour (ce qui s'avère généralement être simple ou impossible).

TMN
la source
7

J'ai trouvé une conception pour une application de bureau (qui n'a pas encore été entièrement testée) avec des exigences similaires qui pourraient être utiles.

Ma solution était d'utiliser le modèle MVC (avec un seul modèle mais plusieurs contrôleurs et vues) où chaque contrôleur apportait des modifications au modèle à l'aide de transactions (à l'aide de STM ) et lorsqu'une transaction était validée, le modèle diffusait une notification de mise à jour à la vue (s). ).

Chaque client a également gardé une trace de tout ce qui était mis à jour localement, mais lorsque ces mises à jour locales ont été terminées (c'est-à-dire envoyées pour être validées), il a recommencé à utiliser les informations du modèle sous-jacent.

J'ai également eu une pile d'annulation avec toutes les modifications apportées par les utilisateurs afin que les choses puissent être inversées.

Ce n'est peut-être pas le meilleur modèle pour une application Web, car le modèle a dû diffuser des modifications dans les vues, ce qui n'est peut-être pas le plus simple avec un client Web.

Paul
la source
4

pour 1. vous devriez voir si le modèle de publication / abonnement est mieux adapté.
pour 2. cela dépend de votre situation:

  • quelle sera la fréquence de cette situation?
  • quelle est la situation dans laquelle l'un de vos utilisateurs ne pourra pas mettre à jour une tâche parce qu'elle est verrouillée ou que quelqu'un d'autre l'a modifiée entre-temps?
    personnellement je préfère une approche (utilisée par exemple dans pivotaltracker ) dans laquelle il y a:
    • pas de serrures,
    • vous voyez tous les changements en temps réel, et
    • l'interface utilisateur invite à effectuer des mises à jour mineures fréquentes au lieu de plus grandes sur plusieurs attributs.
    • vous conservez un historique de toutes les modifications apportées. si l'historique est visible pour les utilisateurs, les conflits ou les remplacements qui peuvent survenir peuvent être résolus par des commentaires, des annotations ou des messages.
kr1
la source
La question est plus académique, donc je dirai très souvent de voir comment cela est pris en charge dans le pire des cas. +1 pour les références de modèle.
hulkmeister
@ kr1 pivotaltracker n'a pas d'avertissement de conflit et ne fusionne pas les modifications non conflictuelles.
Eduardo
0

Ma recommandation est de ne jamais verrouiller et signaler un conflit s'il se produit.

Veuillez jeter un œil à:

https://github.com/spring-projects/spring-petclinic/issues/433

Vous pouvez voir une vidéo et un exemple de code.

Cela répondra-t-il à vos exigences?

Eduardo
la source