Domanda

Il mio sistema utilizza il modello di comando con gestori separati. I miei comandi vengono eseguiti su un comandante che attualmente gestisce tutti i comandi in-process.

Ho determinati comandi che fanno almeno 1 di queste cose che sono operazioni lente:

    .
  1. invia un'email
  2. Genera un PDF
  3. invia un fax
  4. interagisce con i servizi Web di 3a partito
  5. Voglio che tutti questi comandi vengano gestiti fuori dal processo in modo che l'Ui sia più scattante.

    Dovrei usare un bus di messaggistica solo per questi comandi o dovrei avere il gestore di comando in-procedy Call BeginInvoke()?

    Modifica - Informazioni aggiuntive

    Il sistema ha un piccolo numero di utenti (forse 100 simultanee in una giornata intensa), quindi la coda probabilmente non sarà mai molto lunga. La cosa principale qui è ridurre la quantità di tempo che l'interfaccia utente è bloccato quando si invia un'e-mail con un PDF allegato (il comando in questione). I dipendenti devono eseguire quel comando molte volte in un giorno.

    Con l'intera situazione in mente, penso che andrò con BeginInvoke() per diverse ragioni:

      .
    1. Tutte le interazioni UI dovrebbero essere toccate per assicurarsi di comportarsi come se il comando sia riuscito. Il promemoria di "È necessario inviare questo documento" è in più luoghi nell'interfaccia utente e fa un aggiornamento a pagina completa una volta inviato il report.
    2. È il centro della stagione impegnativa del mio cliente (svolgono oltre il 50% del loro business annuale in estate), quindi non mi sembra saggiamente in questo momento per presentare un nuovo pezzo di infrastruttura che sono Non familiare con la somministrazione.
    3. Ma sapendo cosa so ora, su un nuovo sistema utilizzerei un bus di servizio da Get-Go per qualsiasi comando lento (praticamente ogni sistema deve inviare un'e-mail) e progettare l'interfaccia utente in modo che i comandi possano essere più facilmente Passato da elaborazione sincrona a asincrona. In implementazione, che fondamentalmente significa ogni post è Ajax ed esegue un'azione nell'interfaccia utente come se fosse riuscita. (Per un esempio, dai un'occhiata come Facebook gestisce i commenti.)

È stato utile?

Soluzione

Entrambe le soluzioni hanno i loro pro e contro.

    .
  • BeginInvoke è una soluzione mortale semplice e il suo semantico è uguale a chiamare direttamente un gestore per comando direttamente.Ma questa soluzione dipende dall'infrastruttura di filettatura: numeri di filettatura massimi, filo congelato a causa dell'accesso concomitante alle risorse IO, ecc.
  • MessageBus è una soluzione molto flessibile e potente in cui è possibile controllare ogni aspetto del processo di gestione dei comandi.Ma introduce un altro strato di astrazione alla tua applicazione che sarebbe un eccessivo eccessivo nel caso in cui più semplice significa meglio

Si consiglia di stimare i requisiti di caricamento del sistema, il numero di questi compiti di sfondo, il fattore di crescita ecc. E dipende da quello per prendere una decisione.

Ma nella mia opinione personale introducendo una soluzione di autobus che si adatta all'10% dei casi.Puoi introdurre un'implementazione del bus NAIVE che sarà possibile estendere alle iterazioni successive se necessario.

Altri suggerimenti

È probabilmente più una questione di affidabilità che ti spingebbe verso un bus di messaggi.Vedi, se la tua transazione originale (quella che ha avuto il BeginInvoke) dovesse avere successo, e poi a metà strada attraverso la tua invocazione, il server doveva crollare, il tuo sistema non avrebbe memoria che deve ancora inviare un'e-mail o generare il PDF.

Un bus di messaggi sarebbe in grado di ribaltare quella seconda transazione su una coda in modo che quando il server è stato riavviato di nuovo, sarebbe andato di nuovo inviare nuovamente l'e-mail.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top