2012-05-24 8 views
22

Hat RabbitMQ irgendein Konzept der Nachrichtenpriorität? Ich habe ein Problem, wenn einige wichtigere Nachrichten aufgrund weniger wichtiger Nachrichten verlangsamt werden, bevor sie in der Warteschlange sitzen. Ich würde es lieben, wenn die Priorität Vorrang hat und sich an die Spitze der Schlange stellt.RabbitMQ und Nachrichtenpriorität

Ich weiß, ich kann dies mit zwei Warteschlangen eine "schnelle" Warteschlange und eine "langsame" Warteschlange annähern, aber das scheint wie ein Hack.

Kennt jemand eine bessere Lösung mit RabbitMQ?

+1

der Punkt einer Warteschlange ziemlich sicher, dass sein FIFO ist, deshalb geht das Konzept der Priorität aus dem Fenster. – robthewolf

+0

Viele Technologien wie ActiveMQ haben auch ein Nachrichtenprioritätskonzept. Dadurch kann die Warteschlange eine hybride FIFO-/Prioritätswarteschlange sein. – Kelly

Antwort

35

Die Antworten auf diese Frage sind nicht mehr aktuell. Ab RabbitMQ 3.5.0 gibt es nun eine In-Core-Unterstützung für AMQP-Standard pro Nachrichtenpriorität. Die documentation hat alle blutigen Details, aber kurz gesagt:

  • Sie müssen die Warteschlange der Prioritätsbereich zu der Zeit definieren, die Warteschlange erstellt wird;
  • Nachrichten ohne Prioritätseinstellung erhalten eine Priorität von 0;
  • Nachrichten mit einer höheren numerischen Priorität als dem in der Warteschlange festgelegten Maximum erhalten die höchste Priorität, die die Warteschlange unterstützt.

Weitere interessante Vorbehalte sind in der Dokumentation. Es lohnt sich, sie zu lesen.

+0

Hallo @Womble, ich habe das Dokument gelesen und hatte ein wenig Mühe, es zu implementieren. Andere Dokumentation ist ziemlich spärlich. Wenn du irgendeinen Einblick hast. Meine Frage ist [hier] (http://stackoverflow.com/questions/29221020/rabbitmq-3-5-and-message-priority) – Ommit

+1

es scheint, es ist nicht eine Priorität der Nachricht, sondern Verbraucherpriorität, die ich denke, sind unterschiedliche Konzepte und nicht Antworten auf obige Frage. – Kostanos

+0

Dies wurde auf die richtige Antwort geändert, da RabbitMQ jetzt Prioritätswarteschlangen unterstützt. – Kelly

-2

RabbitMQ/AMQP hat definitiv ein Konzept der Nachrichtenpriorität - die Nachricht an der Spitze einer Warteschlange hat Vorrang vor der dahinter stehenden, und diese bekommt Vorrang vor der dahinterstehenden und so weiter, ad infinitum.

Können Sie dieses Modell ändern? Nee! :)

9

IIRC RabbitMQ verwendet immer noch das AMQP-Protokoll Version 0.9.1 (erhalten Sie die Spezifikation here). Die Spezifikation erwähnt definitiv Nachrichtenpriorität:

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. 

Und:

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. 

Die Spezifikation sagt Priorität ein Muss ist, so dass ich denke RabbitMQ sollte es implementieren, aber man kann seine Dokumentation konsultieren möchten.

+1

Diese Antwort war bis vor einer Woche falsch, als RabbitMQ 3.5.0 veröffentlicht wurde und Unterstützung für Prioritätswarteschlangen ankündigte ;-) – ferrouswheel

20

Rabbit hat kein anderes Prioritätskonzept als, wie Brian es kurz und bündig formuliert, derjenige, der davor steht, zuerst. ;-)

Ich würde vorschlagen, eine Reihe von Warteschlangen zu implementieren, die dazu dienen, Ihre speziellen Messaging-Anforderungen zu bedienen und diese Warteschlangen modellieren Ihre Priorisierungsanforderungen, indem Sie sie beispielsweise 'MyQueueP1', 'MyQueueP2' usw. nennen unsere Kunden überprüfen P1 vor P2 (usw.) und Servicemeldungen von dort zuerst.

Wenn Sie dann eine Nachricht mit hoher Priorität haben, würden Sie sie mit einem geeigneten Routing-Schlüssel und voila in der entsprechenden Prioritätswarteschlange veröffentlichen.

[update] prüfen diese Frage: In a FIFO Qeueing system, what's the best way the to implement priority messaging

[update] Gemäß den letzten RabbitMQ Release 3.5.0 diese Antwort ist jetzt veraltet und sollte Gültigkeit dieser Version vor für nur Versionen in Betracht gezogen werden. https://stackoverflow.com/a/29068288/489888

+0

Danke für die Antwort, ich hatte gehofft zu vermeiden, mehrere Warteschlangen dafür einzurichten, aber es sieht so aus gehen. – Kelly

+1

Einige Informationen aus [www.rabbitmq.com/api-guide.html]: Abschnitt ** Veröffentlichen von Nachrichten **: Dies sendet eine Nachricht mit Liefermodus 2 (persistent), Priorität 0 und Inhaltstyp "text/plain". Sie können Ihr Nachrichteneigenschaftenobjekt mithilfe einer Builder-Klasse erstellen und dabei beliebig viele Eigenschaften angeben. Beispiel: channel.basicPublish (exchangeName, routingKey, new AMQP.BasicProperties.Builder() .contentType ("text/plain") .deliveryMode (2) .priority (1) .userId ("bob") .build()), messageBodyBytes); – user2602807

+0

Aber es gibt keine andere Erklärung über "Priorität", und was bedeuten sie – user2602807

-7

Wenn es Priorisierung implementiert, wäre es kein MQ.

MQs sind E-Mail-Adressen für Daten. Und in jeder Datenübertragung ist die Aufrechterhaltung der Ordnung lebenswichtig. Wenn Sie die Reihenfolge ändern, werden Löschvorgänge vor Einfügungen ausgeführt, Aktualisierungen werden außerhalb der Reihenfolge ausgeführt. Nichts funktioniert richtig.

Möglicherweise haben Sie eine gültige Implementierung, es gibt ein paar Ausnahmen, aber ich habe festgestellt, dass die meisten Prioritätswarteschlangen entworfen werden, weil die Leute oberflächliche Gedanken über ihre Systemarchitektur und die Interaktionen der Teile darin denken. Die Aufrechterhaltung der Ordnung der Dinge ist fast immer das Richtige, sowohl für die In-Entity- als auch die Inter-Entity-Interaktionen.

Um zu sagen, dass ein Ereignis A eine höhere Priorität als Ereignis B haben kann, müssen die beiden Ereignisse immer entkoppelt werden. Und wenn das passiert, fragt man sich, warum sie überhaupt in derselben Warteschlangenstruktur existieren.Wenn es sich wiederum um eine Payload handelt, wird der Rechenaufwand für diese Payload auch die Leistung des Systems beeinflussen und somit früher entscheiden, dh bevor die Nutzlast sinnvoll ist.

+4

Es gibt viele Nachrichtenwarteschlangen (HornetQ, ActiveMQ ... usw.), die die Nachrichtenpriorität und viele Anwendungsfälle implementieren, die dies unterstützen. –

+0

Tatsächlich sind dies nur logische Erweiterungen der Idee unabhängiger Warteschlangen. Der Begriff Priorität hat für die Pipeline selten eine wirkliche Bedeutung. Es ist semantischer Zucker. Ich sagte nicht, benutze sie nicht, ich sagte, es ist eine potentielle Falle, auf die man achten sollte. Viele Programmierer gehen davon aus, dass eine hohe Priorität eine schnellere Ausführungszeit bedeutet. Wenn sie einen gekoppelten Prozess haben, stellen sie es in die Warteschlange mit niedriger Priorität und das ist gut genug. Wenn es die meiste Zeit funktioniert, wird es akzeptiert und als korrekt angenommen. Dann beginnen Systeme unerklärlicherweise zu versagen und es ist schrecklich zu debuggen. – Michael

+0

Tangential, aber ich sehe nicht, wie E-Mail die Reihenfolge der Lieferung garantieren würde. In der Tat hat email * (grobe) Transportprioritäten, über den 'Precedence:' Header. – tripleee

0

Wir könnten rabbitmq eine Warteschlange mit verteilter Priorität machen, indem wir das Plugin rabbitmq_priority_queue von https://www.rabbitmq.com/community-plugins.html installieren. Sie müssen das Plugin rabbitmq_priority_queue-3.3.x-72d20292.ez herunterladen und in den Plugins-Ordner Ihres Installationsverzeichnisses von hase mq einfügen. Starten Sie den Server neu. Jetzt können Sie Elemente mit einer Priorität in die Warteschlange einfügen und entsprechend verbrauchen, den Beispielcode in How to poll the RabbitMQ to get messages in order of priority continuously? einfügen.

0

Ja, RabbitMQ unterstützt Prioritätswarteschlangen.

Damit eine Warteschlange als Prioritätswarteschlange funktioniert, geben Sie bei der Deklaration der Warteschlange die Eigenschaft x-max-priority an.

Eigenschaft x-max-priority definiert die maximale Priorität, die die Warteschlange unterstützt.

In Java können Sie wie unten tun:

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

Um Nachrichten einer bestimmten Priorität zu veröffentlichen, wie unten tun:

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