2010-09-01 15 views
5

Tengo un productor que quiero distribuir trabajo consistentemente entre los consumidores mediante hash consistente. Por ejemplo, con los nodos consumidores X e Y, las tareas A, B, C siempre deben ir al consumidor X, y D, E, F al consumidor Y. Pero eso puede cambiar un poco si Z se une al grupo de consumidores.¿El productor trabaja sistemáticamente con hash para los consumidores a través de una cola de mensajes?

No quería ocuparme de escribir mi propia lógica para conectarme a los nodos de consumidor, y especialmente no con la administración de nodos uniendo y abandonando el grupo, así que he seguido el camino de usar RabbitMQ, y un exclusivo cola por nodo de consumidor.

Un problema que me estoy encontrando es enumerar estas colas, ya que el productor necesita saber todas las colas disponibles antes de distribuir el trabajo. AMQP ni siquiera admite listas de espera, lo que me hace dudar de mi enfoque completo. Sin embargo, RabbitMQ y Alice (brokenly at the moment) agregan esa funcionalidad: Is there an API for listing queues and exchanges on RabbitMQ?

¿Es esto un uso inteligente de Rabbit? ¿Debo usar una cola de mensajes? ¿Hay un mejor diseño para que la cola pueda constantemente dividir mi trabajo entre los consumidores, en lugar de tener que hacerlo?

+1

Por curiosidad, ¿por qué te importa tanto la consistencia al dividir el trabajo? Como dices, el mapeo cambiará cuando los consumidores sean agregados o eliminados. – scvalex

+1

Podría decir que es para "localidad de referencia". El Consumidor X no sabe de antemano que estará trabajando en A, pero sería beneficioso si X siempre recibe tareas iguales o como A. (Perdón por la vaguedad) De todos modos, para mi propósito, un pequeño cambio es multa. Los cambios en el conjunto deben ser raros. – Bluu

Respuesta

6

Lo que describes es posible en RabbitMQ.

Su configuración sería algo así como:

  • un productor publica el mensaje a un cambio de tema; vamos a llamarlo consistente_divider;
  • cuando un consumidor, se une a la piscina, se conecta con el corredor y crea una cola exclusiva con su nombre, pero no se une a nada
  • del productor sondea periódicamente el corredor (tal vez utilizando list_consumers rabbitmqctl) para comprobar si los consumidores han cambiado; si lo tienen, elimina todos los enlaces existentes y vuelve a enlazar las colas según sea necesario;
  • cuando el productor publica, a los mensajes se les asigna una clave de enrutamiento que coincide con su tipo de tarea.

lo tanto, si usted tiene 6 tipos de tareas: A, B, C, D, E, F, y sólo dos de los consumidores C1 y C2, las fijaciones se vería así: C1 ligada 3 veces a consistent_divider con teclas de enrutamiento A, B y C; C2 enlazado 3 veces a c_d con las claves de enrutamiento D, E y F.

Cuando C3 se une al grupo, el productor lo ve y vuelve a enlazar las colas en consecuencia.

Cuando el productor publica, envía los mensajes con routing_keys A, B, C, D, E y/o F, y los mensajes se enrutarán a las colas correctas.

Habría dos problemas potenciales con este:

  1. Hay un ligero retraso entre el momento en que el consumidor se une a la piscina y los mensajes son enrutados a ella; Además, si ya hay mensajes en las colas, es posible que un consumidor reciba mensajes destinados a otro consumidor (por ejemplo, C3 se une, el productor vuelve a enlazar, pero C2 todavía recibe algunos mensajes E y F porque ya estaban en la cola).
  2. Si un consumidor muere por la razón que sea, los mensajes en su cola (y rumbo a su cola) se perderán; esto se puede resolver republicando y poniendo letras a los mensajes, respectivamente.

para responder a su última pregunta, es probable que desee utilizar colas y RabbitMQ es una gran opción, pero sus requisitos (más precisamente, el dividir el trabajo consistente' bit') no lo bastante en forma AMQP perfectamente.

+0

¡Respuesta muy completa y alentadora! Una pregunta. Usted dice que los consumidores no se obligan a sí mismos. ¿Es esto diferente de que los consumidores se vinculen con una clave de enrutamiento igual a su nombre de cola? Luego, en lugar de list_consumers, incluyo las listas directamente, sin necesidad de más enlaces. – Bluu

+1

Las colas se enlazan automáticamente a amq.default (un intercambio directo) con su nombre como clave de enlace. Por lo que puedo decir, esto no es lo que quieres. No está publicando para los consumidores, por así decirlo, está publicando en tipos de tareas y desea que algunos consumidores manejen muchas tareas. Entonces, estaba pensando en un mapeo de vinculación de una tarea y uno, y los consumidores que se ocupan de tareas múltiples tienen enlaces múltiples. Además, dado que cuando las consolidaciones cambian, todas (la mayoría) de ellas cambian, no parece correcto para un consumidor manejar esto, por lo que el productor parece ser el más adecuado para el trabajo. – scvalex

+0

Buena vista, ¿perderá mensajes al volver a enlazar? – flycee

Cuestiones relacionadas