tutorial nodejs kafka rabbitmq

nodejs - rabbitmq tutorial



RabbitMQ y prioridad de mensaje (7)

¿RabbitMQ tiene algún concepto de prioridad de mensaje? Tengo un problema en el que algunos mensajes más importantes se están ralentizando debido a que hay mensajes menos importantes delante de él en la cola. Me encantaría que los de alta prioridad tengan prioridad y pasen al frente de la cola.

Sé que puedo aproximarme a esto usando dos colas, una cola "rápida" y una cola "lenta", pero eso parece un truco.

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


IIRC RabbitMQ todavía usa 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 que la prioridad es DEBE, por lo que supongo que RabbitMQ debería implementarla, pero es posible que desee consultar su documentación.


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

  • Debe definir el 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 mayor que el máximo establecido en la cola obtienen la prioridad más alta que admite la cola.

Más advertencias interesantes están en los documentos. Vale la pena leerlos.


Podríamos hacer de rabbitmq una cola de prioridad distribuida instalando el complemento rabbitmq_priority_queue desde https://www.rabbitmq.com/community-plugins.html . Debe descargar el complemento rabbitmq_priority_queue-3.3.x-72d20292.ez y colocar dentro de la carpeta de complementos de su directorio de instalación de rabbit mq. Reinicie el servidor. Ahora puede insertar elementos en la cola con una prioridad y consumirlos en consecuencia, ¿ha pegado el código de muestra en Cómo sondear el RabbitMQ para obtener los mensajes en orden de prioridad continuamente? .


Rabbit no tiene un concepto de prioridad que no sea, como Brian lo expresa de manera sucinta, el que está al frente llega primero. ;-)

Sugeriría implementar un conjunto de colas que sirvan para satisfacer sus necesidades particulares de mensajería y que estas colas modelen su necesidad de priorización, por ejemplo, llamándolas ''MyQueueP1'', ''MyQueueP2'' y así sucesivamente para que nuestros consumidores verifiquen P1 antes de P2 (etc.) y los mensajes de servicio desde allí primero.

Si luego tiene un mensaje que es de alta prioridad, lo publicaría en la cola de prioridad adecuada mediante una clave de enrutamiento adecuada y listo.

[actualización] Marque esta pregunta: En un sistema FIFO Qeueing, ¿cuál es la mejor manera de implementar la mensajería de prioridad?

[actualización] Según la reciente versión 3.5.0 de RabbitMQ, esta respuesta ahora está desactualizada y debe considerarse válida solo para versiones anteriores a esta versión. https://.com/a/29068288/489888


RabbitMQ / AMQP definitivamente tiene un concepto de prioridad de mensaje: el mensaje que se encuentra al principio de una cola tiene prioridad sobre el que está detrás, y que uno tiene prioridad sobre el que está detrás, y así sucesivamente, hasta el infinito.

¿Puedes cambiar ese modelo? No :)


Sí, RabbitMQ soporta colas de prioridad.

Para hacer que una cola funcione como una cola de prioridad, proporcione la propiedad x-max-priority cuando declare la cola.

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

En Java, puedes hacer lo siguiente:

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 mensajes de una prioridad particular, haga lo siguiente:

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());


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

Los MQ son email para datos. Y en toda transmisión de datos, preservar el orden es vital. Si cambia el orden, las eliminaciones suceden antes de las inserciones, las actualizaciones quedan fuera de 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 la gente está pensando 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 entre entidades como entre ellas.

Para poder 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. Entonces, nuevamente, si está relacionado con la carga útil, el esfuerzo de cálculo para esa carga útil también afectará el rendimiento del sistema, por lo que decidir antes, es decir, antes de hacer que la carga útil tenga sentido.