2011-05-04 13 views
5

Actualmente estoy en el proceso de armar una arquitectura de referencia para un sistema distribuido basado en eventos donde los eventos se almacenan en una base de datos Azure de SQL Server utilizando tablas simples (no SQL Server Service Broker).Queues de bases de datos y procesamiento de colas

Los eventos se procesarán utilizando Roles de trabajo que sondearán la cola para nuevos mensajes de eventos.

En mi investigación, veo una serie de soluciones que permiten que múltiples procesadores procesen los mensajes fuera de la cola. El problema que tengo con muchos de los patrones que veo es la complejidad añadida de administrar el bloqueo, etc. cuando varios procesos intentan acceder a la cola de mensajes únicos.

Entiendo que el patrón de cola tradicional es tener varios procesadores que extraen de una sola cola. Sin embargo, suponiendo que los mensajes de evento se puedan procesar en cualquier orden, ¿hay alguna razón para no crear simplemente una relación de uno a uno entre una cola y su procesador de cola y solo equilibrar la carga entre las diferentes colas?

queue_1 => processor_1
queue_2 => processor_2

Esta aplicación evita todas las tuberías necesarias para administrar el acceso simultáneo a la cola entre varios procesadores. El editor de eventos puede usar cualquier algoritmo de equilibrio de carga para decidir a qué cola publicar los mensajes.

El hecho de que no veo este tipo de aplicación en cualquiera de mis búsquedas me hace pensar que estoy con vistas a un déficit importante en este diseño.

Editar

Este post ha desencadenado un debate sobre el uso de tablas de bases de datos como las colas frente a MSMQ, Azure colas, etc. Entiendo que hay una serie de opciones de gestión de colas nativos a mi disposición, incluyendo mensaje duradero Buffers en Azure AppFabric. Evalué mis opciones y determiné que las tablas de SQL Azure serán suficientes. La intención de mi pregunta era discutir el uso de múltiples procesadores contra una única cola frente a un procesador por cola.

+0

"Entonces, ¿qué me estoy perdiendo?" Sugeriría que te falta el punto de utilizar una cola de eventos adecuada. Crear una cola de eventos usando una base de datos parece tonto cuando las colas de eventos ya son productos de primera clase. ¿Por qué no usar MS-MQ y ahorrarse un montón de dolor? –

+0

@S. Lott: Yo diría que siempre hay una razón para tener sus colas y datos en la misma tienda. Copia de seguridad/restauración uniforme, eliminación del compromiso en dos fases con cada operación (DTC entre el almacén de mensajes y el almacén de datos), un producto para implementar/solucionar problemas/administrar, una solución HA/DR que falla sobre el almacén de mensajes y el almacén de datos estado coherente, todo esto y más hacen un caso muy convincente para colas dentro de la base de datos. Teniendo en cuenta que casi todos los mensajes se inician como resultado de una operación de datos y terminan actualizando datos, los eventos * son * datos y pertenecen juntos. –

+0

@ S.Lott: 1) No tengo MSMQ, ya que estoy implementando en Azure. 2) MS-MQ tiene mucho dolor. –

Respuesta

1

Como se mencionó S. Lott, existen mecanismos de cola de mensajes que puede utilizar. MSMQ no será de gran ayuda en Windows Azure, pero Windows Azure ya cuenta con un mecanismo de cola duradero. Puede configurar fácilmente cada instancia de rol de trabajador para leer uno (o más) elementos de cola. Una vez que se lee un elemento de cola, es "invisible" durante el tiempo que especifique (o 30 segundos si no se especifica el tiempo). Los mensajes de cola pueden tener hasta 8K y se consideran "duraderos": todo el almacenamiento de Azure se replica al menos 3 veces (como es SQL Azure).

Si bien se puede implementar algo parecido a lo que se describe GBN, realmente pienso que usted debe considerar el servicio de cola de Azure nativa cuando se trabaja en Windows Azure. Podrá escalar fácilmente a múltiples consumidores de cola y no tendrá que preocuparse por la simultaneidad o el código especial de equilibrio de carga; simplemente aumente (o disminuya) el recuento de instancias.

Para obtener más información acerca de las colas de Windows Azure, consulte Azure Platform Training Kit: hay varios laboratorios sencillos que lo guían a través de los conceptos básicos de la cola.

+0

http://msdn.microsoft.com/en-us/library/dd179363.aspx? ¿Es ese un enlace útil? –

+0

Azure Queues es una opción que estoy buscando. Sin embargo, me preocupa el hecho de que no sean transaccionales. –

+0

Desde un "entendimiento de los fundamentos principales de Colas Azure": sí, es absolutamente un enlace útil. Tenga esto en cuenta: hay un completo .NET SDK oficial que oculta toda la API REST para que no tenga que preocuparse por eso (aunque es útil entenderlo). También hay bibliotecas para php y Java, y algunos proyectos de código abierto para Ruby y python también. –

0

El punto que te falta, en mi opinión, es que al usar colas uno de los puntos importantes es que las órdenes se guardan y pase lo que pase una vez que está en la cola, no se perderá.

Ahora el proceso de pollers puede morir, tienen muchos problemas diferentes, no importa, la fila es donde los pedidos están seguros.

Los pollers no requieren el mismo nivel de robustez. Postfix por ejemplo es una implementación muy segura del transportador de correo donde las colas de mensajes se usan en muchos niveles (cada subsistema en la aplicación que requiere un nivel de seguridad diferente se comunica con otros con colas) y se puede desconectar la energía no perderá ningún correo, los trabajadores pueden morir muy mal, los correos no pueden.

Editar

Eso significa que el uso básico es el almacenamiento de un pedido, y haciendo caso omiso de lo que los trabajadores van a hacer con eso, el número de trabajadores todavía están vivos, etc. Así que la única razón para manejar varias colas es administre varios destinos para su orden (lógica de aplicación) y no administre la manera en que los trabajadores deberían trabajar con ellos (Desacoplamiento).

5

Ver Using tables as Queues para una discusión más detallada de este tema. El problema no es solo cómo accede a la 'cola', sino también cómo la indexa, el índice agrupado debe permite la búsqueda directa de la siguiente fila para dequear, de lo contrario, se estancará constantemente.

Desea que sus procesadores compitan por la misma cola, el equilibrio de carga al extenderse a diferentes colas es un antipatrón. Conduce a convoys y latencia artificial donde tiene elementos en cola detrás de un procesador anterior, pero otros procesadores están libres y en reposo porque su cola está vacía.

+0

No estoy seguro de que equilibrar la carga al tener varias colas constituiría un antipatrón, ya que estoy simplemente dividiendo horizontalmente la tabla, lo cual es común. Convoys WRT y procesadores finales, supongo que un algoritmo de balanceo de carga adecuado distribuiría publicaciones en cada cola de una manera que los mantendría equilibrados. –

+0

Si al particionar implica escalar el almacén de mensajes, entonces la única manera es hacer varias colas. Pero si planea implementar varias colas en una tienda (es decir, una base de datos Azure), me atengo a mi opinión de que una cola es mejor que varias. La escalabilidad de una única cola, cuando se realiza correctamente, es mucho mayor de lo que puede generar un solo DB de Azure, por lo que no hay ninguna razón para tener más colas. –

+0

Buena entrada. Tomaré tus argumentos en consideración. Gracias por la respuesta. –

Cuestiones relacionadas