Il primo passo è sempre un'adeguata analisi dei requisiti. Supponiamo che io sia un Project Manager. Accedo al sistema e visualizza il mio unico progetto come in tempo. Uno sviluppatore arriva nel mio ufficio e mi dice che c'è un ritardo nella sua attività. Seleziono l'attività dello sviluppatore e cambio la sua durata. Il sistema visualizza ancora il mio progetto come in tempo, quindi sono felice di lasciare il lavoro.
Come pensi che mi sentirei se ricevessi una telefonata alle 3:00 dal cliente chiedendomi una spiegazione del motivo per cui il progetto non è più in tempo? Ovviamente, abbastanza sorpreso, perché il sistema non mi ha avvisato in alcun modo. Perché è successo? Perché ho dovuto aspettare 30 secondi (perché non solo 1 secondo?) Per la prossima esecuzione di un lavoro programmato per aggiornare lo stato del progetto.
Questo non può essere una soluzione. Un avviso deve essere inviato immediatamente all'utente, anche se occorrono 30 secondi per eseguire il processo IsStale()
. Mostra all'utente un'immagine loading...
o qualsiasi altra cosa, ma assicurati che l'utente abbia dati precisi.
Ora, per quanto riguarda l'implementazione, non è possibile eseguire nulla per evitare il problema precedente: sarà necessario eseguire tale processo quando qualcosa che influisce su alcune date di scadenza cambia. Tuttavia, ciò che puoi fare non è eseguire inutilmente quel processo. Ad esempio, hai accennato al fatto che potresti eseguirlo ogni volta che l'utente effettua l'accesso. Cosa succede se 2 o più utenti accedono e visualizzano lo stesso progetto e non cambiano nulla? Non sarebbe necessario eseguire il processo due volte.
Inoltre, se si assicura che il processo venga eseguito quando l'utente aggiorna il progetto, non sarà necessario eseguire il processo in qualsiasi momento.In conclusione, questo schema presenta i seguenti vantaggi e svantaggi rispetto alla soluzione "polling":
Vantaggi
- Nessun processo pianificato
- Non viene eseguito il processo non necessari (questo è discutibile, perché si potrebbe impostare una bandiera
dirty
sul progetto e solo eseguirlo se è true
)
- Nessun query non necessarie del valore
dirty
- L'utente sarà sempre informato dello stato attuale e reale del progetto (che è di gran lunga, la voce più importante per affrontare in qualsiasi soluzione fornita)
Svantaggi
- Se un l'utente aggiorna un progetto e lo ripristina in pochi secondi, il processo verrebbe eseguito due volte (nello schema di polling il processo potrebbe non essere eseguito nemmeno una volta in quel periodo, a seconda della frequenza programmata)
- l'utente che aggiorna il progetto dovrà attendere il completamento del processo
Passando al modo in cui si implementa il sistema di notifica in modo simile a StackOverflow, è una domanda abbastanza diversa. Immagino tu abbia una relazione molti-a-molti con utenti e progetti. La soluzione più semplice sarebbe l'aggiunta di un singolo attributo al rapporto tra tali entità (tabella centrale ):
cardinalità: Un utente ha molti progetti. Un progetto ha molti utenti
In questo modo quando si esegue il processo è necessario aggiornare Has_pending_notifications
di ciascun utente con il nuovo risultato. Ad esempio, se un utente aggiorna un progetto e non è più in tempo, è necessario impostare su Has_pending_notifications
il campo tutti gli utenti in modo che siano a conoscenza della situazione. Allo stesso modo, impostalo su false
quando il progetto è in tempo (ho capito che vuoi solo assicurarti che le notifiche vengano visualizzate quando il progetto non è più in tempo).
Prendendo l'esempio di StackOverflow, quando un utente legge una notifica è necessario impostare il flag su false
. Assicurati di non utilizzare i timestamp per indovinare se un utente ha letto una notifica: l'accesso non significa leggere le notifiche.
Infine, se la notifica in sé è abbastanza complessa, è possibile allontanarlo dal rapporto tra utenti e progetti e andare per qualcosa di simile a questo:
cardinalità: un utente ha molti progetti . Un progetto ha molti utenti. Un utente ha molte notifiche. Una notifica ha un utente. Un progetto ha molte notifiche.Una notifica ha un progetto.
spero qualcosa che ho detto ha un senso, o ti danno qualche altra idea migliore :)
suo metodo IsStale(), che è lento – leora
Tempo confronto timbro non dovrebbe essere lento, ma la vostra altra opzione è quella di aggiungere questa logica sul lato database. Se è possibile, creare una stored procedure che esegue il confronto e restituisce il risultato come una colonna aggiuntiva. – evasilchenko
IsStale() NON sta semplicemente confrontando la data/ora.è un algoritmo più complicato per vedere se i dati non sono aggiornati in base a un numero di fattori – leora