2010-03-23 11 views
5

Una parte dell'applicazione su cui sto lavorando è una swf che mostra un test con circa 80 domande. Ogni domanda viene salvata in SQL Server tramite WebORB e ASP.NET.Accodamento utilizzando il database o MSMQ?

Se un candidato termina il test, la sessione deve essere convalidata. Il problema è che a volte 350 candidati terminano il test nello stesso momento e la CPU sul server Web e su SQL Server esplode (350 convalide contemporaneamente).

Ora, come devo implementare l'accodamento qui? Nel database, c'è una tabella che ha un record per ogni sessione. Una colonna mantiene lo stato. 1 è finito, 2 è convalidato.

ho potuto implementare la fila in due modi (come la vedo io, forse hai altre proposte):

  • Un processo che controlla la tabella per i record con lo stato 1. Se ne trova uno, convalida il sessione. Quindi, le sessioni vengono convalidate una dopo l'altra.
  • Se un candidato termina la sua sessione, un messaggio viene inviato a una coda MSMQ. Un altro processo ascolta la coda e convalida le sessioni una dopo l'altra.

Ora:

  • Quale sarebbe l'approccio migliore?
  • Da dove si avvia il processo che convaliderà le sessioni? Nel tuo global.asax (application_start)? Come servizio di Windows? Come exe sulla radice del sito Web avviato in application_start?

Per me, utilizzare la tabella e cercare i record con lo stato 1 sembra il modo più semplice.

risposta

4

L'approccio MSMQ decouples l'applicazione Web dal servizio di logica di convalida e il database.

Questo porta numerosi vantaggi, alcuni dei quali:

  • sarebbe più facile da gestire situazioni in cui la logica di validazione può gestire 5 sessioni al secondo, e riceve 300 tutto in una volta. Altrimenti dovresti gestire timeout, tentativi ripetuti, ecc.

  • Sarebbe più semplice fare manutenzione sul servizio di convalida, senza dover interrompere il resto dell'applicazione. Quando il servizio di validazione viene disattivato, i messaggi si accodano in MSMQ e vengono elaborati nuovamente non appena viene richiamato.

  • Come per la manutenzione del database vale quanto sopra.

1

Che cos'è validating? Prima di lavorare sulla tua strategia di accodamento, proverei a rendere il validating il più veloce possibile, includendolo in base al set se non lo è già.

+0

Ho cercato su Google, ma non sono abbastanza sicuro di cosa intendi. Ho fatto la convalida il più velocemente possibile (ora a 500ms per sessione), ma ancora, se 350 candidati convalidano allo stesso tempo, fa 175 secondi. Sebbene sia carico-bilanciato, quindi in realtà è 350/4 sec. Funziona, ma la CPU del server web si avvicina al 100% per alcuni minuti. –

+1

utilizzando le operazioni "set based" per quanto riguarda la programmazione del database si ha quando si emette un singolo comando di database, come UPDATE e questo ha effetto su tutte le righe, invece di eseguire il loop su ogni riga e fare un UPDATE separato su ciascuna. Ho fatto un google su "elaborazione basata su set di database" e qui ci sono due articoli da vicino: http://www.codeproject.com/KB/database/SetAndProceduralSQL.aspx e http://weblogs.sqlteam.com/jeffs /archive/2007/04/30/60192.aspx –

3

Se non si dispone di esperienza con MSMQ e nessuna infrastruttura è configurata, vorrei sconsigliarlo. Certo, potrebbe essere il modo "corretto" di fare la coda sulla piattaforma Microsoft, ma non è molto semplice e ha una curva di apprendimento abbastanza.

Lo stesso vale per la creazione di un servizio di Windows; non farlo a meno che tu non abbia familiarità con esso. Per casi semplici come questo, direi che il dolore è più grande delle ricompense.

La soluzione più semplice sarebbe probabilmente quella di utilizzare la tabella ed eseguire il processo su un thread in background che si avvia in global.asax. Probabilmente vorresti anche creare una pagina di amministrazione che possa riportare alcune informazioni sullo stato del processo (numero di lavori in sospeso ecc.) E magari un pulsante per riavviare il processo se per qualche motivo fallisce.

0

Recentemente ho indagato su questo, quindi volevo menzionare le mie scoperte. La posizione del Database rispetto alla tua applicazione è un fattore importante per decidere quale opzione è più veloce.

Ho verificato l'inserimento del tempo necessario per inserire 100 voci di database rispetto alla registrazione degli stessi dati esatti in un messaggio MSMQ locale. Ho quindi preso la media dei risultati dell'esecuzione di questo test più volte.

Quello che ho trovato è che quando il database si trova sulla rete locale, l'inserimento di una riga era fino a 4 volte più veloce di accedere a un MSMQ.

Quando si eseguiva l'accesso al database tramite una connessione internet decente, l'inserimento di una riga nel database era fino a 6 volte più lento di accedere a un MSMQ.

Quindi:

Database locale - DB è più veloce, altrimenti MSMQ è.

+0

Per garantire questa opinione, ho sentito la stessa cosa. Ho provato ad inserire 100 record nel database che si trova nella mia rete nel mio stesso edificio e quindi ho creato Private MSMQ nel mio laptop e ho fatto lo stesso. MSMQ ha impiegato più di 1,5 volte più tempo del database. Immagino che MSMQ sia buono quando si dispone di un numero di servizi che desiderano scrivere i dati nello stesso posto. –

+0

mi sono imbattuto in questa citazione: "SSB sarà significativamente più veloce di MSMQ in modalità transazionale MSMQ sarà più veloce se operiamo in modalità non trasferita (miglior sforzo, non ordinato, consegna)". Quindi ... è possibile specificare se i test sono stati eseguiti con una coda transazionale o senza transazione? – Mario