Come gestite più utenti modificando la stessa porzione di dati in una webapp?


26

C'è un progetto a cui sto lavorando che sta cercando di produrre un'applicazione Web che gestirà un elenco di attività tra più utenti. Questo è un elenco di attività principali le cui attività vengono distribuite da un utente autorizzato. Ogni utente ha il proprio account per accedere e visualizzare le attività che gli sono state assegnate; è possibile che più utenti abbiano in comune un'unica attività.

Sto cercando di tralasciare i dettagli del progetto mentre mi sto occupando di più del concetto generale di come gestire le seguenti situazioni, ma se aiuta, sto usando Java, EclipseLink e GWT con RequestFactory implementato. Il database è PostgreSQL.

Quindi i problemi concettuali che sto tentando di conciliare sono i seguenti:

  1. Se una singola attività comune a più utenti cambia in qualsiasi modo, ad esempio attività completata, eliminata, ecc., L'elenco delle attività di tutti gli utenti che hanno questa attività verrà aggiornato. Quali sono i modelli di progettazione che aiutano a implementare questa funzione?

    • Alcuni schemi che ho visto sono Observer e Mediator - ce ne sono altri che dovrebbero essere presi in considerazione?
  2. Supponiamo che due utenti cambino la stessa attività contemporaneamente.

    • Innanzitutto, dovrei consentire che si verifichi tale situazione o dovrei bloccarla fino a quando l'una o l'altra persona non ha apportato modifiche?

    • Secondo, se non ci metto un lucchetto, come posso riconciliare le modifiche da accettare? Ciò comporta la situazione in 1 perché l'utente 1 potrebbe inviare i dati e prima che l'utente 2 riceva i dati aggiornati, potrebbe essere andato avanti e aver inviato le proprie modifiche.

Sto davvero cercando eventuali punti guida, consigli o suggerimenti che puoi fornire su come sincronizzare correttamente i dati tra più istanze di questa app Web. Lo apprezzerei moltissimo!

Risposte:


17

Penso che la lavagna sarà il tuo modello preferito per il numero 1, dovresti pubblicare le modifiche alle attività (o altri dati condivisi) in un luogo comune, in modo che tutte le parti interessate possano vederle e DTRT.

Per il n. 2, è necessario esaminare il blocco ottimistico . Fondamentalmente, è necessario timestamp di tutti i record modificabili con l'ora dell'ultimo aggiornamento. Quando si tenta di salvare il record, si verifica innanzitutto che il record nel database abbia lo stesso timestamp dell'ultimo aggiornamento del record. In caso contrario, qualcuno ha aggiornato il record e ora è necessario ottenere il record aggiornato e informare l'utente che è necessario immettere nuovamente le modifiche oppure è possibile provare a unire le modifiche dell'utente nel record aggiornato (che di solito risulta essere semplici o impossibili).


7

Ho ideato un progetto per un'applicazione desktop (che deve ancora essere completamente testata) con requisiti simili che potrebbero essere utili.

La mia soluzione era quella di utilizzare il modello MVC (con un singolo modello ma più controller e viste) in cui ciascun controller ha apportato modifiche al modello utilizzando le transazioni (utilizzando STM ) e quando una transazione è stata impegnata, il modello ha trasmesso una notifica di aggiornamento alle ).

Ogni cliente ha anche tenuto traccia di tutto ciò che veniva aggiornato localmente, ma quando quegli aggiornamenti locali erano finiti (cioè inviati per essere impegnati), è tornato a utilizzare le informazioni del Modello sottostante.

Ho anche avuto uno stack di annullamento con tutte le modifiche apportate dagli utenti in modo che le cose potessero essere ripristinate.

Questo potrebbe non essere il modello migliore per un'app Web, poiché il Modello ha dovuto trasmettere le modifiche alle Viste, che potrebbe non essere il più semplice con un client Web.


4

per 1. dovresti vedere se il modello di pubblicazione / sottoscrizione è più adatto.
per 2. dipende dalla tua situazione:

  • quanto frequente sarà questa situazione?
  • quanto è grave una situazione in cui uno dei tuoi utenti non sarà in grado di aggiornare un'attività perché è bloccata o nel frattempo qualcun altro l'ha modificata?
    personalmente preferisco un approccio (utilizzato ad esempio nel pivotaltracker ) in cui ci sono:
    • senza serrature,
    • vedi tutti i cambiamenti in tempo reale e
    • l'interfaccia utente invita a fare aggiornamenti minori frequenti anziché più grandi su più attributi.
    • conservi una cronologia di tutte le modifiche apportate. se la cronologia è visibile agli utenti, eventuali conflitti o sovrascritture possono essere risolti con commenti, annotazioni o messaggi.

La domanda è più accademica, quindi dirò molto spesso di vedere come è stata risolta nel caso peggiore. +1 per i riferimenti del modello.
hulkmeister,

@ kr1 pivotaltracker non contiene avvisi di conflitto e non unisce modifiche non in conflitto, quindi non dovrebbe essere usato come un buon esempio di una buona applicazione multiutente per la modifica dei record.
Eduardo,

0

La mia raccomandazione è di non bloccare mai e segnalare un conflitto se accade.

Per favore, dai un'occhiata a:

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

Puoi vedere un video e un codice di esempio.

Riuscirà a soddisfare le tue esigenze?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.