Permítanme compartir con ustedes mis experiencias en esta área, puede que le resulte útil.
Mi equipo utilizó por primera vez las colas transaccionales de MSMQ que alimentarían nuestros servicios asíncronos (ya sea IIS alojado o WAS). El mayor problema que encontramos fue problemas de MS DTC bajo una gran carga, como más de 100 mensajes/segunda carga; todo lo que se necesitó fue una operación de base de datos lenta en algún lugar para comenzar a causar excepciones de tiempo de espera y MS DTC derribaría la casa por así decirlo (las transacciones se perderían si las cosas empeoraban), y aunque no estamos 100% seguros de la raíz porque hasta el día de hoy sospechamos que MS DTC en un entorno agrupado tiene algunos problemas graves.
Debido a esto, comenzamos a buscar diferentes soluciones. Service Bus para Windows Server (la versión in situ de Azure Service Bus) parecía prometedor, pero no transaccional, por lo que no se ajustaba a nuestros requisitos.
Finalmente nos decidimos por el enfoque "roll-your-own", un enfoque que nos sugirieron los chicos que construyeron el Azure Service Bus, debido a nuestros requisitos transaccionales. Básicamente, seguimos el modelo de Rol de trabajador de Azure para un rol de trabajador que se alimentaría a través de una cola; un modelo de bloqueo de sondeo
Honestamente, esto ha sido mucho mejor para nosotros que cualquier otra cosa que hayamos usado. El pseudocódigo para este tipo de servicio es:
hasMsg = true
while(true)
if(!hasMsg)
sleep
msg = GetNextMessage
if(msg == null)
hasMsg = false
else
hasMsg = true
Process(msg);
Hemos encontrado que el uso de la CPU es menor significativamente de esta manera (más bajo que los servicios tradicionales de WCF).
La parte difícil, por supuesto, es el manejo de las transacciones. Si desea que varias instancias de su servicio se lean desde la cola, deberá emplear read-past/updlock en su sql, y también hacer que su servicio .net se aliste en las transacciones de una manera que se extenderá. volver si el servicio falla. en este caso, querrá ir con las colas de reintento/envenenamiento como tablas además de sus colas habituales.
pregunta se ha hecho muchas veces en SO; por favor busque SO –
Buen enlace en el área general. http://rusanu.com/2010/03/26/using-tables-as-queues/ Edit: No estoy seguro de que responda a su pregunta específica sobre el bloqueo hasta que se agreguen elementos a la cola. Además, no estoy seguro de haber visto esa pregunta específica antes en SO. –
¿Sabía que SQL Server tiene * colas * reales, ¿verdad? http://msdn.microsoft.com/en-us/library/ms345108(v=sql.90).aspx –