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.
"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? –
@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. –
@ S.Lott: 1) Non ho MSMQ, poiché sto distribuendo su Azure. 2) MS-MQ ha un sacco di dolore. –