2012-07-18 15 views
6

Tengo un servicio de Windows escrito en C# que lee de MSMQ y se basa en el tipo de mensaje que les asigna a los agentes que procesan ese mensaje en un hilo de trabajo. La aplicación se inicia con ningún agente y se crean dinámicamente en tiempo de ejecución como los mensajes llegan en el MSMQMSMQ problema de diseño de procesamiento simultáneo

Aquí es una figura básica de cómo funciona:

enter image description here

Si el subproceso de trabajo agente está ocupado haciendo el trabajo el mensaje está en cola a su cola local. Hasta aquí todo bien. Pero si por algún motivo se detiene el servicio, se pierde el contenido de la cola local.

Estoy tratando de averiguar cuál podría ser la mejor manera de manejar este escenario. En este momento, las colas locales son System.Concurrent.ConcurrentQueue. Probablemente podría usar un Sql Ce db u otro almacenamiento persistente, pero estoy preocupado por el rendimiento. La otra cosa en mi mente es leer de MSMQ solo cuando los agentes están listos para procesar el mensaje, pero el problema es que no sé qué mensaje contendrá el MSMQ.

¿Qué enfoques posibles puedo tomar sobre este tema?

Respuesta

1

He creado un sistema similar que depende de Redis. La idea es que proporciona memoria, un acceso de datos rápido y aislado del resto de la aplicación, y no se apagará cuando lo haga mi servicio. Además, con el tiempo persistirá mi información en el disco, por lo que tengo un buen compromiso entre confiabilidad y velocidad.

Si diseñó para que cada cliente lea desde su propia cola de mensajes que se alojaría en Redis, podría mantener la cola independiente del tiempo de inactividad del servicio, y la carga de cada trabajador distribuida la próxima vez que inicie el servicio.

+0

Me encantaría usar Redis aquí, pero ¿no crees que sería una exageración? – Obaid

+0

No, en absoluto. Es extremadamente liviano y hace para lo que fue diseñado, así que en lugar de elaborar y depurar algo nuevo solo, puedes usar algo que pueda hacer el trabajo por ti. Como alternativa, podría usar archivos mapeados en memoria para lograr acceso rápido a algún tipo de almacenamiento permanente, pero hay algunas complicaciones, y no sé sobre seguridad de hilos ... –

0

¿Por qué no simplemente crea dos nuevas colas msms para recibir los mensajes de Agenta y agentb, y crea un nuevo agente que (transaccionalmente) recupera el comando de la cola principal y envía el mensaje a la cola del agente adecuado?

+0

En realidad, los Agentes se crean dinámicamente en función del tipo de mensaje que llega a MSMQ. El tipo de mensaje puede variar de 1 a n. Por lo tanto, no puedo crear una cola separada para tipos de mensajes potencialmente desconocidos. – Obaid

+0

ObaidR ¿por qué no? puede crear una cola programáticamente, ¿es potencialmente tan grande? –

+0

n será alrededor de 15 ~ 20 tal vez. Pero luego tendré que cambiar el sistema en el otro extremo, donde colocará los mensajes en colas separadas según el tipo de mensaje. Me preguntaba si podría manejar esto en mi servicio de alguna manera. – Obaid

3

Su diseño es básicamente implementa el siguiente patrón: http://www.eaipatterns.com/MessageDispatcher.html

Sin embargo, en lugar de utilizar la mensajería real que usted está eligiendo para implementar el despachador en el código multiproceso.

Más bien, cada agente de procesamiento debe ser un proceso autónomo con su propia cola de mensajes físicos. Esto es lo que proporcionará la durabilidad del mensaje en caso de falla. También le permite escalar simplemente alojando más instancias del agente de procesamiento.

+0

No estoy seguro de que necesite tener procesos separados, a mano desde un PoV de aislamiento pero difícil de coordinar. Definitivamente de acuerdo con tener colas de mensajes separadas para cada agente (creado mediante programación utilizando algún tipo de convención que permita que el nombre de la cola incluya algún tipo de identificador que lo vincule con el agente responsable de sus mensajes.) Luego, durante el inicio del servicio puede recrear cualquier agentes que tienen colas ya existentes. –

Cuestiones relacionadas