web-dev-qa-db-fra.com

RabbitMQ et priorité du message

RabbitMQ a-t-il un concept de priorité de message? J'ai un problème, car certains messages plus importants sont ralentis en raison de messages moins importants qui attendent leur tour dans la file d'attente. J'adorerais que les plus prioritaires prennent la priorité et passent au premier plan.

Je sais que je peux approximer cela en utilisant deux files d'attente, une file "rapide" et une file "lente", mais cela semble être un hack. 

Est-ce que quelqu'un connaît une meilleure solution avec RabbitMQ?

29
Kelly

Les réponses à cette question sont obsolètes. Depuis RabbitMQ 3.5.0, les priorités par message AMQP standard sont désormais prises en charge. La documentation a tous les détails sanglants, mais en bref:

  • Vous devez définir la plage de priorités de la file d'attente au moment de sa création.
  • Les messages sans priorité ont la priorité 0;
  • Les messages dont la priorité numérique est supérieure au maximum défini dans la file d'attente obtiennent la priorité la plus élevée prise en charge par la file d'attente.

Des avertissements plus intéressants se trouvent dans la documentation. Cela vaut la peine de les lire.

48
womble

Rabbit n'a pas d'autre concept de priorité que, comme le dit succinctement Brian, celui qui est au premier plan y arrive en premier. ;-)

Je suggérerais de mettre en place un ensemble de files d’attente répondant à vos besoins particuliers en matière de messagerie et de les modéliser en fonction de vos besoins en termes de priorité, en les appelant par exemple «MyQueueP1», «MyQueueP2», etc., puis demandez à nos consommateurs de vérifier P1 avant P2 (etc.) et les messages de service de là en premier.

Si vous avez ensuite un message hautement prioritaire, vous le publiez dans la file d'attente prioritaire appropriée au moyen d'une clé de routage appropriée et le tour est joué.

[update] Cochez cette question: Dans un système FIFO Qeueing, quel est le meilleur moyen d'implémenter la messagerie prioritaire

[update] Selon la récente version 3.5.0 de RabbitMQ, cette réponse est maintenant obsolète et doit être considérée comme valide uniquement pour les versions antérieures à cette version . https://stackoverflow.com/a/29068288/489888

20
Steve Martin

IIRC RabbitMQ utilise toujours le protocole AMQP version 0.9.1 (obtenez la spécification ici ). La spécification mentionne clairement la priorité du message:

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.

Et:

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 spécification indique que la priorité est un MUST, donc je suppose que RabbitMQ devrait l'implémenter, mais vous voudrez peut-être consulter sa documentation.

10
vanza

Oui, RabbitMQ prend en charge les files d'attente prioritaires.

Pour qu'une file d'attente fonctionne comme une file d'attente prioritaire, indiquez la propriété x-max-priority lors de la déclaration de la file d'attente.

La propriété x-max-priority définit le numéro de priorité maximum pris en charge par la file d'attente.

En Java, vous pouvez faire comme ci-dessous:

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

Pour publier des messages d'une priorité particulière, procédez comme suit:

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

Nous pourrions faire de rabbitmq une file d'attente à priorités distribuées en installant le plug-in rabbitmq_priority_queue depuis https://www.rabbitmq.com/community-plugins.html . Vous devez télécharger le plugin rabbitmq_priority_queue-3.3.x-72d20292.ez et y placer le dossier plugins de votre répertoire d'installation du lapin mq. Redémarrez le serveur. Maintenant, vous pouvez insérer des éléments dans la file d'attente avec une priorité et les consommer en conséquence, vous avez collé l'exemple de code dans Comment interroger le RabbitMQ pour obtenir les messages par ordre de priorité en continu?

0
Ranjith