2011-05-04 17 views
5

Attualmente sto mettendo insieme un'architettura di riferimento per un sistema basato su eventi distribuiti in cui gli eventi sono archiviati in un database di SQL Server di Azure utilizzando semplici tabelle (senza SQL Server Service Broker).Elaborazione code e code di database

Gli eventi verranno elaborati utilizzando i ruoli di lavoro che eseguiranno il polling della coda per i nuovi messaggi di evento.

Nella mia ricerca, vedo un numero di soluzioni che consentono a più processori di elaborare i messaggi fuori dalla coda. Il problema che ho con molti dei modelli che vedo è la complessità aggiuntiva della gestione del blocco, ecc. Quando più processi tentano di accedere alla coda dei messaggi singoli.

Sono consapevole del fatto che il modello di coda tradizionale prevede l'estrazione di più processori da una singola coda. Tuttavia, supponendo che i messaggi degli eventi possano essere elaborati in qualsiasi ordine, c'è qualche ragione per non creare solo una relazione uno-a-uno tra una coda e il suo processore di coda e solo il bilanciamento del carico tra le diverse code?

queue_1 => processor_1
queue_2 => processor_2

Questa implementazione evita tutto l'impianto idraulico necessario per gestire l'accesso concorrente alla coda tra più processori. L'editore di eventi può utilizzare qualsiasi algoritmo di bilanciamento del carico per decidere su quale coda pubblicare i messaggi.

Il fatto che io non veda questo tipo di implementazione in nessuna delle mie ricerche mi fa pensare che sto trascurando un deficit maggiore in questo progetto.

Modifica

Questo post è innescato un dibattito sulla utilizzando le tabelle del database come code vs MSMQ, Azure code, ecc ho capito che ci sono una serie di opzioni di accodamento nativo a mia disposizione, tra cui messaggio durevole Buffer in AppFabric di Azure. Ho valutato le mie opzioni e ho stabilito che le tabelle SQL Azure saranno sufficienti. L'intenzione della mia domanda era di discutere l'uso di più processori contro una singola coda rispetto a un processore per coda.

+0

"Allora, cosa mi manca?" Ti suggerirei che ti manca l'intero punto di utilizzo di una coda di eventi corretta. Costruire una coda di eventi utilizzando un database sembra sciocco quando le code di eventi sono già prodotti di prima classe. Perché non usare MS-MQ e risparmiare un sacco di dolore? –

+0

@S. Lott: Direi che c'è sempre un motivo per avere le code e i dati nello stesso negozio. Backup/ripristino uniforme, eliminazione del commit a due fasi con ogni operazione (DTC tra l'archivio messaggi e l'archivio dati), un prodotto da distribuire/risolvere/amministrare, una soluzione HA/DR che fallisce nell'archivio messaggi e nell'archivio dati in un stato coerente, tutto questo e molto altro ancora rendono un caso molto interessante per le code all'interno del database. Considerando che quasi ogni messaggio inizia come risultato di un'operazione di dati e finisce per aggiornare i dati, gli eventi * sono * i dati e appartengono insieme. –

+0

@ S.Lott: 1) Non ho MSMQ, poiché sto distribuendo su Azure. 2) MS-MQ ha un sacco di dolore. –

risposta

1

Come detto da S.Lott, ci sono meccanismi di coda messaggi che è possibile utilizzare. MSMQ non sarà di grande aiuto in Windows Azure, ma Windows Azure ha già un meccanismo di coda affidabile. È possibile impostare facilmente ciascuna istanza del ruolo di lavoro per leggere uno (o più) elementi della coda. Una volta che un elemento della coda viene letto, è "invisibile" per il periodo di tempo specificato (o 30 secondi se non è specificato il tempo). I messaggi in coda possono essere fino a 8K e sono considerati "duraturi": tutto lo spazio di archiviazione di Azure viene replicato almeno 3 volte (come SQL Azure).

Mentre è possibile implementare qualcosa di simile a ciò che descrive gbn, penso davvero che si dovrebbe prendere in considerazione il servizio nativo di Azure Queue quando si lavora in Windows Azure. Sarai facilmente in grado di ridimensionare a più utenti della coda e non dovrai preoccuparti della concorrenza o di un codice di bilanciamento del carico speciale - basta aumentare (o diminuire) il conteggio delle istanze.

Per ulteriori informazioni sulle code Windows Azure, consulta lo Azure Platform Training Kit - ci sono diversi laboratori semplici che ti guidano attraverso le basi della coda.

+0

http://msdn.microsoft.com/en-us/library/dd179363.aspx? È un collegamento utile? –

+0

Le code di Azure sono un'opzione che sto esaminando. Tuttavia, mi preoccupo del fatto che non siano transazionali. –

+0

Da una "comprensione delle basi di Azure Queues" - sì, assolutamente un collegamento utile. Tieni questo a mente: c'è un SDK completo e ufficiale che nasconde tutte le API REST in modo da non doverti preoccupare di ciò (è comunque utile per capire). Esistono anche librerie per PHP e Java e alcuni progetti open source per Ruby e Python. –

0

Il punto che ti manca, a mio avviso, è che quando si utilizzano le code uno dei punti importanti è che gli ordini vengono salvati e qualsiasi cosa accada una volta in coda non andrà persa.

Ora il processo di polling può morire, hanno molti problemi diversi, non importa, la coda è il luogo in cui gli ordini sono sicuri.

Poller non richiede lo stesso livello di robustezza. Ad esempio, Postfix è un'implementazione molto sicura del trasporto di posta in cui le code di messaggi sono utilizzate in molti livelli (ogni sottosistema nell'applicazione che richiede un diverso livello di sicurezza comunica con gli altri con le code) - e si può spegnere la corrente non perderà alcuna posta, i lavoratori possono morire molto male, le mail non possono.

Modifica

Ciò significa che l'uso di base sta memorizzando un ordine, e ignorando quello che i lavoratori faranno con questo, quanti lavoratori sono ancora in vita, ecc Quindi l'unica ragione per gestire diverse code è quello di gestire diverse destinazioni per il tuo ordine (logica dell'applicazione) e non gestire il modo in cui gli operai dovrebbero lavorare con loro (disaccoppiamento).

5

Vedere Using tables as Queues per una discussione più dettagliata di questo argomento. Il problema non è solo il modo in cui si accede alla "coda", ma anche il modo in cui indicizzarlo, l'indice cluster deve consente la ricerca diretta della riga successiva da eliminare, altrimenti si bloccherà costantemente.

Se si desidera che i processori raggiungano la stessa coda, il bilanciamento del carico distribuito su code diverse è un anti-modello. Porta a convogli e latenza artificiale in cui sono presenti elementi accodati dietro un processore in ritardo, ma altri processori sono liberi e inattivi perché la loro coda è vuota nella loro .

+0

Non sono sicuro che il bilanciamento del carico avendo più code costituirebbe un anti-pattern, dato che sto solo partizionando orizzontalmente la tabella, che è comune. Convogli WRT e processori in ritardo, presumo che un corretto algoritmo di bilanciamento del carico distribuisca le pubblicazioni a ciascuna coda in modo da mantenerle in equilibrio. –

+0

Se per partizionamento si implica il ridimensionamento dell'archivio messaggi, più code sono l'unico modo. Tuttavia, se si prevede di distribuire più code in un unico archivio (ad esempio un database di Azure), il mio punto di vista è che una coda è meglio di più. La scalabilità di una singola coda, se eseguita correttamente, è di gran lunga maggiore di quella che può essere gestita da un singolo DB di Azure, quindi non è un motivo per avere più code. –

+0

Buon input. Prenderò in considerazione i tuoi argomenti. Grazie per il feedback. –