RabbitMQ et priorité des messages

est-ce que RabbitMQ a un concept de priorité de message? J'ai un problème parce que certains messages plus importants sont ralentis en raison de messages moins importants qui sont placés devant lui dans la file d'attente. J'aimerais hautement prioritaires à prendre le pas et de passer à l'avant de la file d'attente.

je sais que je peux approximer cela en utilisant deux files d'attente une file d'attente" rapide "et une file d'attente" lente", mais cela ressemble à un piratage.

est-ce que quelqu'un connaît une meilleure solution à l'aide de RabbitMQ?

26
demandé sur Roger Lipscombe 2012-05-25 00:50:52

7 réponses

les réponses à cette question sont périmées. En date de RabbitMQ 3.5.0, il y a maintenant un soutien de base pour les priorités standard par message de L'AMQP. Le documentation a tous les détails sanglants, mais en bref:

  • vous devez définir la plage de priorité de la file d'attente au moment où la file d'attente est créée;
  • les Messages sans jeu de priorité obtiennent une priorité de 0;
  • Messages
  • avec une priorité numérique plus élevé que le maximum fixé sur la file d'attente obtenir la plus haute priorité la queue prend en charge.

des mises en garde plus intéressantes figurent dans les documents. C'est bien la peine de les lire.

44
répondu womble 2015-03-16 01:20:44

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

je suggérerais de mettre en place un ensemble de files d'attente qui servent à répondre à vos besoins particuliers en matière de messagerie et de faire en sorte que ces Files d'attente modèlent vos besoins en matière de priorisation, par exemple en les appelant "MyQueueP1", "MyQueueP2" et ainsi de suite et que nos consommateurs vérifient P1 avant P2(etc.) et les messages de service à partir de là en premier.

si vous un message qui est prioritaire vous devez publier à la file d'attente de priorité par le biais d'une clé de routage et le tour est joué.

[mise à jour] Vérifier cette question: dans un système de mise en file D'attente FIFO, Quelle est la meilleure façon de mettre en œuvre la messagerie prioritaire

[mise à jour] selon la version récente de RabbitMQ 3.5.0 cette réponse est maintenant périmée et devrait être considérée comme valide pour les versions antérieures à la présente publier. https://stackoverflow.com/a/29068288/489888

20
répondu Steve Martin 2017-05-23 12:17:36

IIRC RabbitMQ utilise toujours la version 0.9.1 du protocole AMQP (voir 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 dit que la priorité est un MUST, donc je suppose que RabbitMQ devrait le mettre en œuvre, mais vous voudrez peut-être consulter sa documentation.

10
répondu vanza 2012-05-25 02:51:18

Oui, RabbitMQ appuie les files d'attente prioritaires.

pour qu'une file d'attente fonctionne comme file d'attente prioritaire, fournissez le bien x-max-priority lorsque vous déclarez la file d'attente.

Property x-max-priority définit le nombre de priorité maximum que la file d'attente supporte.

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, faire comme ci-dessous:

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
répondu Liquidpie 2017-06-12 11:50:16

nous pourrions faire de rabbitmq une file d'attente prioritaire distribuée en installant le plugin rabbitmq_priority_queue de https://www.rabbitmq.com/community-plugins.html . Vous devez télécharger le plugin rabbitmq_priority_queue-3.3.x-72d20292.ez et mis à l'intérieur du dossier plugins de votre lapin mq répertoire d'installation. Redémarrez le serveur. Maintenant, vous pouvez insérer des articles dans la file d'attente avec une priorité et le consommer en conséquence , ont collé le code échantillon dans comment sonder le RabbitMQ pour obtenir des messages par ordre de priorité en permanence? .

0
répondu Ranjith 2017-05-23 12:25:36

RabbitMQ / AMQP a certainement un concept de priorité de message - le message en tête d'une file d'attente obtient la priorité sur celui derrière elle, et que l'on obtient la priorité sur celui derrière elle, et ainsi de suite, ad infinitum.

pouvez-vous changer ce modèle? Nope! :)

-2
répondu Brian Kelly 2012-05-25 02:39:49

S'il mettait en œuvre la priorisation, il ne s'agirait pas d'un MQ.

MQs sont des courriels pour les données. Et dans toute transmission de données, préserver l'ordre est vital. Si vous changez l'ordre, les suppressions se produisent avant les inserts, les mises à jour sortent de la séquence. Rien ne fonctionne correctement.

vous avez peut-être une implémentation valide, il y a quelques exceptions, mais j'ai constaté que la plupart des files d'attente sont conçues parce que les gens pensent à des pensées superficielles sur leur système l'architecture et les interactions des parties qui y sont. Préserver l'ordre des choses est presque toujours la bonne chose à faire, à la fois pour les interactions au sein de l'entité et entre les entités.

pour dire d'Un événement peut avoir une priorité plus élevée que l'évènement B, les deux événements doivent être découplé toujours. Et quand cela arrive, on se demande pourquoi ils existent dans la même structure de file d'attente. Encore une fois, si elle est liée à la charge utile, l'effort de calcul pour cette charge utile va aussi impact sur la performance du système, donc décider plus tôt, c'est-à-dire avant de faire la charge utile a du sens.

-7
répondu Michael 2013-05-06 23:48:28