2012-07-18 9 views
6

Ho un servizio Windows scritto in C# che legge da MSMQ e basato sul tipo di messaggio che assegna ad agenti che elaborano quel messaggio in un thread di lavoro. L'applicazione si avvia senza agenti e vengono creati in modo dinamico in fase di esecuzione, come i messaggi arrivano nella MSMQProblema di progettazione dell'elaborazione simultanea MSMQ

Ecco una figura di base di come funziona:

enter image description here

Se il thread di lavoro agente è occupato a fare il lavoro il messaggio viene accodato alla sua coda locale. Fin qui tutto bene. Ma se per qualche motivo se il servizio viene interrotto, il contenuto della coda locale viene perso.

Sto cercando di capire quale potrebbe essere il modo migliore per gestire questo scenario. Al momento le code locali sono System.Concurrent.ConcurrentQueue. Potrei probabilmente usare un db Sql Ce o qualche altra memoria persistente, ma sono preoccupato per le prestazioni. L'altra cosa nella mia mente è leggere da MSMQ solo quando gli agenti sono pronti per elaborare il messaggio, ma il problema è che non conosco il messaggio che MSMQ conterrà.

Quali possibili approcci posso affrontare in merito a questo problema?

risposta

1

Ho costruito un sistema simile dipendente da Redis. L'idea è che fornisce memoria - accesso rapido ai dati isolato dal resto dell'applicazione, e non si spegne quando il mio servizio funziona. Inoltre, alla fine manterrà i miei dati sul disco, quindi ottengo un buon compromesso tra affidabilità e velocità.

Se lo si progettava in modo che ogni client leggesse dalla propria coda di messaggi che sarebbe ospitata in Redis, è possibile mantenere la coda indipendente dal tempo di inattività del servizio e ogni carico di lavoro ripartito al successivo avvio del servizio.

+0

Mi piacerebbe usare Redis qui, ma non pensi che sarebbe eccessivo? – Obaid

+0

Niente affatto. È estremamente leggero e fa ciò che è stato progettato per bene, quindi invece di preparare e debug di qualcosa di nuovo tutto da solo, puoi usare qualcosa che possa fare il lavoro per te. In alternativa, è possibile utilizzare i file mappati in memoria per ottenere un accesso rapido a qualche tipo di archiviazione permanente, ma ci sono alcune complicazioni e non conosco la sicurezza dei thread ... –

0

Perché non è sufficiente creare due nuove code msms per ricevere i messaggi per Agenta e agentb e creare un nuovo agente che (a livello di transazione) preleva il comando dalla coda principale e invia il messaggio alla coda agente corretta?

+0

In realtà gli agenti sono creati dinamicamente in base al tipo di messaggio che arriva in MSMQ. Il tipo di messaggio può variare da 1 a n. Quindi non posso creare una coda separata per tipi di messaggi potenzialmente sconosciuti. – Obaid

+0

ObaidR perché no? puoi creare una coda a livello di programmazione, n è potenzialmente grande? –

+0

n sarà circa 15 ~ 20 forse. Ma poi dovrò cambiare il sistema all'altra estremità dove metterà i messaggi in code separate in base al tipo di messaggio. Mi stavo chiedendo se potevo gestire questo nel mio servizio in qualche modo. – Obaid

3

vostro disegno è fondamentalmente implementa il seguente schema: http://www.eaipatterns.com/MessageDispatcher.html

Tuttavia, invece di utilizzare la messaggistica reale si sceglie di implementare il dispatcher nel codice multithread.

Piuttosto, ogni agent di elaborazione deve essere un processo autonomo con la propria coda di messaggi fisici. Questo è ciò che fornirà la durata del messaggio in caso di guasto. Consente inoltre di ridimensionare semplicemente ospitando più istanze dell'agente di elaborazione.

+0

Non sono sicuro che sia necessario disporre di processi separati, pratici da un PoV di isolamento ma difficili da coordinare. Sicuramente concordare con l'esistenza di code di messaggi separate per ogni agente (create a livello di programmazione utilizzando un tipo di convenzione che consente al nome della coda di includere un tipo di identificatore che lo collega all'agente responsabile dei messaggi.) Quindi durante l'avvio del servizio è possibile ricreare qualsiasi agenti che hanno già le code esistenti. –