Pregunta

Necesito poner en cola eventos y tareas para sistemas externos de manera confiable / transaccional. Usar cosas como MSMQ o ActiveMQ parece muy seductor, pero la parte transaccional se vuelve complicada (MSDTC, etc.).

Podríamos usar la base de datos (SQL Server 2005+, Oracle 9+) y lograr un soporte transaccional más fácil, pero la parte de la cola se vuelve más fea.

Ninguna de las dos rutas parece tan buena y está llena de trampas desagradables y casos extremos.

¿Puede alguien ofrecer alguna orientación práctica en este asunto?

Piense: E / C / A o un motor de tareas programadas que se despierta cada cierto tiempo y vea si hay tareas programadas que deben ejecutarse en este momento (es decir, la próxima fecha de ejecución ha pasado, pero la fecha de vencimiento ha aún no ha sido alcanzado).

¿Fue útil?

Solución

nuestro sistema tiene 60 computadoras, cada una de las cuales ejecuta 12 tareas (subprocesos) que necesitan "obtener el próximo trabajo". En general, se trata de 50K " trabajos " por día. hacer el cálculo de cuántas transacciones por minuto y darse cuenta de que el tiempo de la tarea es variable, por lo que es posible obtener múltiples "pop" eventos al mismo tiempo.

Tuvimos nuestra primera versión usando MSMQ. conclusión: mantente alejado . Si bien lo hizo bien con los problemas de carga y sincronización, tuvo 2 problemas. Un molesto y un trato único.

Molesto: como software de empresa, MSMQ tiene necesidades de seguridad que solo hacen que sea una cosa más configurar y luchar con el administrador de la red de clientes.

Break breaker: llegó el momento en que quisimos tomar el siguiente trabajo, pero no usamos un simple pop, sino algo como " obtener el siguiente trabajo AZUL " o " consigue el siguiente trabajo AMARILLO " ;. no puedo hacerlo!

Fuimos al plan B: implementamos nuestra propia Q con una sola tabla SQL 2005. no podría ser más feliz

Hice hincapié en probarlo con 200K mensajes por día, funcionó. Podemos hacer el " siguiente " Lógica tan complicada como queramos.

el problema: debes tener mucho cuidado con el SQL que toma el siguiente elemento. Ya que quieres que sea rápido y NO bloqueado. hay 2 sugerencias de SQL muy importantes que usamos en base a algunas investigaciones. La magia es algo como esto:

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy

Otros consejos

He visto que MSMQ se usaba transaccionalmente y no parecía particularmente complicado: un Transaction SCope envolvió las llamadas en cola o en cola junto con el acceso a la base de datos y todo estuvo bien siempre que la cola se definiera como transaccional una vez que se creó. No creo que esto sea cierto con ActiveMQ, que es un intermediario de mensajes, pero MSMQ se instala localmente en cada máquina de punto final, por lo que obtener un elemento de forma transaccional en la cola no requiere una transacción distribuida de lujo.

Probablemente ya esté al tanto de esto, pero en .NET hay algunas bibliotecas ligeras que proporcionan algunas abstracciones agradables sobre MSMQ (y, en teoría, otros transportes)

nServiceBus: www.nservicebus.com

Transporte público: http://code.google.com/p/masstransit/

Además, Oren Eini tiene una cola transaccional interesante, aunque basada en un sistema de archivos experimental. El beneficio de esta biblioteca es que, a diferencia de MSMQ, se puede implementar como una biblioteca y no requiere el dolor de cabeza de mantenimiento de la implementación de MSMQ.

Puede leer sobre eso aquí: http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

Además, SQL Server 2005 maneja las colas de manera bastante elegante, utilizando SQL Server Service Broker, pero necesitará que se instale SQL Server en cada punto final, y no sé si SSB cruza el firewall.

Finalmente, si no obtiene la respuesta que está buscando aquí, le recomiendo el foro de discusión nSErviceBus. Udi Dahan responde a este tipo de preguntas junto con su pequeño grupo de seguidores orientados a mensajes, y es el mejor recurso que he encontrado hasta ahora para que mis preguntas orientadas a la cola sean respondidas de manera rápida y competente. Ese foro está aquí: http://tech.groups.yahoo.com/group/nservicebus/

Quartz.Net es un sistema de programación de trabajos de código abierto.

Esto es para lo que MSMQ está diseñado: hacer cola con las transacciones. Si eso no le funciona, consulte el " Service Broker " característica de SQL Server: es la cola " en una tabla SQL " ese 'csmba' describe en su respuesta, pero es un componente integrado de SQL Server, bien empaquetado y expuesto para su uso.

¿Es WebSphere MQ (MQ Series) una opción? Es compatible con la mensajería transaccional.

Puede consultar la función de Oracle llamada Cola avanzada

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top