2012-05-24 49 views
22

¿Tiene RabbitMQ algún concepto de prioridad de mensaje? Tengo un problema con algunos mensajes más importantes que se están desacelerando debido a mensajes menos importantes que se encuentran antes en la cola. Me encantaría que los de alta prioridad tengan prioridad y pasen al principio de la cola.RabbitMQ y prioridad de mensaje

Sé que puedo aproximar esto utilizando dos colas una cola "rápida" y una cola "lenta", pero parece un truco.

¿Alguien sabe de una mejor solución usando RabbitMQ?

+1

bastante seguro de la punta de una cola es que su FIFO, por lo tanto, el concepto de prioridad sale por la ventana. – robthewolf

+0

Muchas tecnologías como ActiveMQ también tienen un concepto de prioridad de mensaje. Esto permite que la cola sea una cola híbrida FIFO/Priority. – Kelly

Respuesta

35

Las respuestas a esta pregunta están desactualizadas. A partir de RabbitMQ 3.5.0, ahora hay soporte interno para las prioridades de AMQP por mensaje estándar. El documentation tiene todos los detalles morbosos, pero en resumen:

  • Es necesario definir rango de prioridad de la cola en el momento en que se crea la cola;
  • Los mensajes sin un conjunto de prioridades obtienen una prioridad de 0;
  • Los mensajes con una prioridad numérica superior al máximo establecido en la cola obtienen la prioridad más alta que admite la cola.

Hay advertencias más interesantes en los documentos. Vale la pena leerlos.

+0

hola @Womble, leí el documento y tuve algunos problemas para implementarlo. Otra documentación es bastante escasa. Si tiene alguna idea. Mi pregunta es [aquí] (http://stackoverflow.com/questions/29221020/rabbitmq-3-5-and-message-priority) – Ommit

+1

parece que no es una prioridad de mensaje sino una prioridad para el consumidor, que creo que son conceptos diferentes y no respuestas a la pregunta anterior. – Kostanos

+0

Cambié esto a la respuesta correcta ya que RabbitMQ ahora admite colas de prioridad. – Kelly

-2

RabbitMQ/AMQP definitivamente tiene un concepto de prioridad de mensaje: el mensaje en la cabecera de una cola tiene prioridad sobre el que está detrás de él, y que uno tiene prioridad sobre el que está detrás de él, y así sucesivamente, ad infinitum.

¿Puedes cambiar ese modelo? ¡No! :)

9

IIRC RabbitMQ sigue utilizando el protocolo AMQP versión 0.9.1 (obtenga la especificación here). La especificación definitivamente menciona la prioridad del mensaje:

Messages may have a priority level. A high priority message is sent ahead of lower  priority messages 
waiting in the same message queue. When messages must be discarded in order to maintain a specific 
service quality level the server will first discard low-priority messages. 

Y:

Note that in the presence of multiple readers from a queue, or client transactions, or use of priority fields, 
or use of message selectors, or implementation-specific delivery optimisations the queue MAY NOT 
exhibit true FIFO characteristics. 

la especificación dice prioridad es una necesidad, así que supongo RabbitMQ debe ponerlo en práctica, pero puede que desee consultar a su documentación.

+1

Esta respuesta fue incorrecta hasta hace una semana cuando se lanzó RabbitMQ 3.5.0 y se anunció el soporte para colas de prioridad ;-) – ferrouswheel

20

Rabbit no tiene otro concepto de prioridad que no sea, como dice sucintamente Brian, el que está en frente llega primero. ;-)

Sugeriría implementar un conjunto de colas que sirvan para atender su necesidad particular de mensajería y hacer que estas colas modelen su necesidad de priorización, digamos, llamándolas 'MyQueueP1', 'MyQueueP2', etc. nuestros consumidores verifican primero P1 antes de P2 (etc.) y los mensajes de servicio desde allí.

Si tiene un mensaje de alta prioridad, debe publicarlo en la cola de prioridad adecuada mediante una clave de enrutamiento adecuada y listo.

[Actualización] Comprobar esta pregunta: In a FIFO Qeueing system, what's the best way the to implement priority messaging

[Actualización] De acuerdo con la reciente liberación 3.5.0 RabbitMQ esta respuesta se ha quedado desfasado y debe ser considerada válida sólo para las versiones anteriores a esta versión. https://stackoverflow.com/a/29068288/489888

+0

Gracias por la respuesta, esperaba evitar la configuración de varias colas para esto, pero parece que es el camino a seguir. ir. – Kelly

+1

Alguna información de [www.rabbitmq.com/api-guide.html]: Sección ** Publicar mensajes **: Esto envía un mensaje con el modo de entrega 2 (persistente), la prioridad 0 y el tipo de contenido "texto/normal". Puede construir su objeto de propiedades de mensaje, utilizando una clase de generador que mencione tantas propiedades como desee, por ejemplo: channel.basicPublish (exchangeName, routingKey, new AMQP.BasicProperties.Builder() .contentType ("text/plain") .deliveryMode (2) .priority (1) .userId ("bob") .build()), messageBodyBytes); – user2602807

+0

Pero no hay otra explicación sobre "prioridad", y qué quieren decir – user2602807

-7

Si implementa la priorización, no sería un MQ.

Los MQ se envían por correo electrónico para obtener los datos. Y en todos los datos, la preservación de la transmisión es vital. Si cambia de orden, las eliminaciones suceden antes de las inserciones, las actualizaciones se salen de la secuencia. Nada funciona correctamente

Puede tener una implementación válida, hay algunas excepciones, pero he encontrado que la mayoría de las colas de prioridad están diseñadas porque las personas piensan en pensamientos poco profundos sobre la arquitectura de su sistema y las interacciones de las partes. Preservar el orden de las cosas es casi siempre lo correcto, tanto para las interacciones dentro de la entidad como entre las entidades.

Para decir que un evento A puede tener una prioridad más alta que el evento B, los dos eventos deben estar desacoplados siempre. Y cuando eso sucede, uno se pregunta por qué existen en la misma estructura de cola.Por otra parte, si está relacionado con la carga útil, el esfuerzo de cálculo para esa carga útil también tendrá un impacto en el rendimiento del sistema, por lo que decidir antes, es decir, antes de hacer la carga útil, tiene sentido.

+4

Hay muchas colas de mensajes (HornetQ, ActiveMQ ... etc.) que implementan prioridad de mensaje y muchos casos de uso que la admiten. –

+0

En efecto, estas son simplemente extensiones lógicas de la idea de colas independientes. El término prioridad rara vez tiene un significado real en lo que respecta a la tubería. Es azúcar semántica. No dije que no los usas, dije que es una trampa potencial a tener en cuenta. Muchos programadores suponen que una alta prioridad significa un tiempo de ejecución más rápido. Cuando tienen un proceso acoplado, lo ubican en la cola de baja prioridad y eso es suficiente. Si funciona la mayor parte del tiempo, se acepta y se adopta como correcto. Entonces los sistemas comienzan a fallar inexplicablemente y es horrible depurar. – Michael

+0

Tangencial, pero no veo cómo el correo electrónico garantizaría el orden de entrega. De hecho, el correo electrónico * does * tiene prioridades (crudas) de transporte, por medio del encabezado 'Precedence:'. – tripleee

0

Podríamos hacer de rabbitmq una cola de prioridad distribuida instalando el complemento rabbitmq_priority_queue de https://www.rabbitmq.com/community-plugins.html. Tienes que descargar el plugin rabbitmq_priority_queue-3.3.x-72d20292.ez y ponerlo dentro de la carpeta de plugins de tu directorio de instalación de rabbit mq. Reinicia el servidor. Ahora puede insertar elementos en la cola con una prioridad y consumirlos en consecuencia, ha pegado el código de muestra en How to poll the RabbitMQ to get messages in order of priority continuously?.

0

Sí, RabbitMQ admite colas de prioridad.

Para que una cola funcione como una cola de prioridad, proporcione la propiedad x-max-priority al declarar la cola.

La propiedad x-max-priority define el número de prioridad máxima que admite la cola.

En Java, se puede hacer, como a continuación:

Map<String, Object> props = new HashMap<>(); 
props.put("x-max-priority", 10); // max priority number as 10 
channel.queueDeclare(QUEUE_NAME, durable, false, false, props); 

Para publicar los mensajes de prioridad concreto, lleve, como a continuación:

String message = "My message with priority 7"; 
AMQP.BasicProperties.Builder basicProps = new AMQP.BasicProperties.Builder(); 
basicProps.contentType("text/plain") 
      .priority(7); 
channel.basicPublish("", QUEUE_NAME, basicProps.build(), message.getBytes()); 
Cuestiones relacionadas