Come gestisci più utenti che modificano lo stesso pezzo di dati in una webapp?

16

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 i cui elementi di attività vengono distribuiti da un utente autorizzato. Ogni utente ha il proprio account per accedere e visualizzare i compiti assegnati; è possibile che più utenti abbiano un'unica attività in comune.

Sto cercando di lasciare dettagli del progetto fuori da questo mentre sto affrontando di più il 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 es. attività completata, cancellata, ecc., l'elenco delle attività di tutti gli utenti che hanno questa attività verrà aggiornato. Quali sono i modelli di progettazione che assistono nell'implementazione di questa funzione?

    • Alcuni pattern che ho visto sono Observer e Mediator - ci sono altri che dovrebbero essere considerati su questi?
  2. Supponiamo che ci siano due utenti che cambiano la stessa attività allo stesso tempo.

    • Innanzitutto, dovrei consentire che si verifichi quella situazione o dovrei bloccarla fino a quando l'una o l'altra persona ha terminato le modifiche?

    • In secondo luogo, se non inserisco un blocco su di esso, come faccio a riconciliare le modifiche da accettare? Ciò implica la situazione in 1 perché l'utente 1 potrebbe inviare i dati e prima che l'utente 2 riceva i dati aggiornati, lui / lei potrebbe essere andato avanti e ha inviato le sue modifiche.

Sono davvero alla ricerca di punti guida, consigli o suggerimenti che puoi fornire su come sincronizzare correttamente i dati tra più istanze di questa web app. Lo apprezzerei molto!

    
posta hulkmeister 18.01.2013 - 06:40
fonte

3 risposte

14

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

Per il n. 2, devi consultare blocco ottimistico . Fondamentalmente, devi timestamp tutti i tuoi record modificabili con l'ultimo tempo di aggiornamento. Quando si tenta di salvare il record, verificare innanzitutto che il record nel database abbia lo stesso timestamp aggiornato l'ultimo 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 in genere risulta essere semplice o impossibile)

    
risposta data 18.01.2013 - 14:57
fonte
6

Mi è venuto in mente un design per un'applicazione desktop (che deve ancora essere completamente testata) con requisiti simili che potrebbero essere utili.

La mia soluzione era di utilizzare il modello MVC (con un modello singolo ma più controller e viste) in cui ogni controller ha apportato modifiche al modello utilizzando le transazioni (utilizzando STM ) e quando una transazione impegnato, il modello ha trasmesso una notifica di aggiornamento alla / e vista / i.

Ogni client teneva traccia di tutto ciò che veniva aggiornato localmente, ma quando gli aggiornamenti locali erano finiti (cioè inviati per essere commessi) tornava ad usare le informazioni del modello sottostante.

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

Questo potrebbe non essere il miglior modello per un'app Web, dal momento che il Modello ha dovuto trasmettere le modifiche alle Visualizzazioni, il che potrebbe non essere il più semplice con un client Web.

    
risposta data 18.01.2013 - 16:28
fonte
4

per 1. dovresti vedere se il modello pubblicare / sottoscrivere è più adatto.
per 2. dipende dalla tua situazione:

  • quanto sarà frequente questa situazione?
  • quanto è grave una situazione in cui uno dei tuoi utenti non sarà in grado di aggiornare un'attività perché è bloccata o qualcun altro l'ha modificata nel frattempo?

    personalmente preferisco un approccio (usato ad esempio in pivotaltracker ) in cui ci sono:
    • no lock,
    • vedi tutti i cambiamenti in tempo reale e
    • l'interfaccia utente invita a fare frequenti aggiornamenti minori invece di quelli più grandi su più attributi.
    • mantieni una cronologia di tutte le modifiche apportate. se la cronologia è visibile agli utenti, i conflitti o le sovrascritture che potrebbero nascere possono essere risolti con commenti, annotazioni o messaggi.
risposta data 18.01.2013 - 08:31
fonte