Trabajo en una aplicación web que es una aplicación basada en la nube multi-tenant (muchos clientes, cada uno con su propio "entorno" separado, pero todo en conjuntos compartidos de hardware) y estamos presentando la capacidad de un usuario para trabajar por lotes para el procesamiento posterior. Los tipos de trabajo por lotes realmente no son importantes, es solo cantidad suficiente que hacerlo sin una cola de trabajo no es realmente práctico. Seleccionamos RabbitMQ como nuestro marco de cola subyacente.Grupos de trabajadores y colas de múltiples usuarios con RabbitMQ
Debido a que somos una aplicación multi-tenant, no necesariamente queremos que los clientes puedan causar largos tiempos de proceso de cola para otro cliente, así que una idea que hemos flotado es crear una cola en un base del cliente y tener un grupo de trabajadores compartidos apuntado en TODAS nuestras colas de clientes. El problema es que, al mejor que puedo imaginar, los trabajadores están directamente vinculados a una cola específica, no a un intercambio. En nuestro mundo ideal, nuestras colas de clientes se seguirán procesando, sin que un cliente bloquee a otra, de un grupo de trabajadores compartidos que podamos aumentar o reducir según sea necesario iniciando más trabajadores o cerrando los inactivos. Tener trabajadores atados a una cola específica nos impide esto en un sentido práctico, ya que con frecuencia tenemos muchos trabajadores que simplemente están inactivos en una cola sin actividad.
¿Es relativamente sencillo lograr esto? Soy bastante nuevo en RabbitMQ y realmente no he podido lograr lo que buscamos. Tampoco queremos tener que escribir una aplicación de consumidor de subprocesos múltiples muy compleja, es una pérdida de tiempo en desarrollo y tiempo de prueba que probablemente no podamos pagar. Nuestra pila está basada en Windows/.Net/C# si es germaine, pero no creo que deba tener una gran importancia en la cuestión que nos ocupa.
No estoy preguntando sobre la asignación de múltiples trabajadores a la misma cola, estoy preguntando sobre el reverso. Quiero que un grupo finito de trabajadores consuma desde un gran número (llamémoslo ~ 500) de colas. – bakasan
He experimentado de primera mano con este tipo de enfoque y no es bonito: es difícil encontrar una heurística adecuada para procesar todas estas colas. ¿Procesa primero las colas más completas? ¿O los que tienen los mensajes más antiguos? En ambos casos, está fuera del protocolo AMQP y debe comenzar a tratar con la API de administración de Rabbit. Entonces, piense: tengamos el mismo número de colas que los trabajadores y agregue una asignación consistente de hash entre 500 Qs y las colas de trabajo. Entonces se da cuenta de que una sola cola yn trabajadores que compiten en ella es todo lo que necesita. –
Tengo un requisito similar, sin embargo, quiero asegurarme de que los mensajes de un cliente en particular se procesen secuencialmente. Un contacto no se elimina antes de que se haya creado, etc. ¿Hay alguna configuración o configuración de RabbitMQ que pueda hacer esto y compartir la cola entre los trabajadores? (¿Es esta una nueva Q ...?) – Aaron