2011-02-11 17 views
8

RabbitMQ cumple todos los requisitos para el proyecto que estoy planificando, guarde uno. Tendría diferentes trabajadores escuchando en cola y es importante que procesen primero los mensajes más nuevos (es decir, el último número de secuencia) (LIFO).Mensajes de reordenación de RabbitMQ

Mi aplicación es tal que los mensajes más nuevos casi obsoletos mensajes más antiguos. Si tiene trabajadores de sobra, aún puede procesar los mensajes anteriores, pero es importante que los más nuevos se hagan primero.

Después de buscar los diversos foros y tal que sólo se puede ver una solución y que es para un cliente para procesar un mensaje que debería en primer lugar:

  • consumen todos los mensajes
  • volver a pedir de acuerdo a la número de secuencia
  • volver a presentar a la cola
  • consumen el primer mensaje

feo y probl ematic si el cliente muere a mitad de camino. Pero mabye alguien aquí tiene una mejor solución.

Mi investigación se basa (en parte) en:

Nota: el tráfico esperado de mensajes será más o menos estar en el rango de 1 msg/hora para algunas colas y 100/minuto para r otros. Entonces nada estelar.

Respuesta

3

Puesto que no hay respuesta, supongo que hice mi tarea bastante bien;)

De todos modos, después de discutir los requisitos con los otros grupos de interés, se decidió que puedo caer el requisito LIFO por ahora. Podemos preocuparnos por eso cuando se trata de eso.

Una solución que probablemente terminaremos adoptando es que el trabajador abra una segunda cola que el maestro puede usar para informar al trabajador qué trabajos ignorar + proporcionar información adicional de control/monitoreo (que parece que lo haremos) necesito de todos modos).

El RabbitMQ que implementa la especificación AMQP 1.0 también puede ayudar aquí.

Así que marcaré esta pregunta como respondida por el momento. Alguien más es aún libre de agregar o mejorar.

1

Una posibilidad podría ser la de utilizar basic.get en un bucle y esperar la respuesta basic-ok.message-count para convertirse en cero (tirar todos los demás mensajes):

while (<get ok> = <call basic.get>) { 
    if (<get ok>.message-count == 0) { 
    // Now <get ok> is the most recent message on this queue 
    break; 
    } else if (<is get-empty>) { 
    // Someone else got it 
    } 
} 

Por supuesto, usted tiene que configurar el mensaje patrones de enrutamiento en el corredor de modo que 1 consumidor que arroje mensajes no se meta con otro. Intente evitar la repetición de los mensajes, ya que aparecerán en la parte superior de la pila, haciéndolos parecer los más recientes.

+0

Gracias por la respuesta. Sin embargo, no me gustaría que un consumidor muera de hambre a los demás.Prefiero que los otros consumidores trabajen en mensajes ligeramente menos recientes (que aún proporcionan cierta información) que dejarlos sentados al ralentí porque el consumidor X vació la cola. Aunque esto también depende de las tasas de mensajes, supongo. – dgorissen

Cuestiones relacionadas