2016-03-24 3 views
1

Ich bin neu in RabbitMQ und das ist verwirrend mich. Ich habe einen direkten Austausch eingerichtet und verschiedene Warteschlangen abonnieren verschiedene Routing-Schlüssel an dieser Börse. Ich möchte, dass wenn eine Nachricht mit einem Routing-Schlüssel veröffentlicht wird, sie nur von einem Abonnenten konsumiert wird, egal wie viele Warteschlangen diesen Routing-Schlüssel abonnieren.Liefern Nachricht an nur eine Warteschlange an einen Routingschlüssel in RabbiqMQ direkten Austausch

Aktuelles Szenario:

Exchange (Typ: Direkt)

-QueueA1 (receives message A from exchange with routing key of "TypeA") 
-QueueA2 (also receive message A from exchange with routing key of "TypeA") 
-QueueB (doesn't receive message A because it subscribes to key "TypeB") 

Wunsch:

-QueueA1 (receives message A from exchange with routing key of "TypeA") 
-QueueA2 (doesn't receive message A because it's already consumed by QueueA1) 
-QueueB (doesn't receive message A because it subscribes to key "TypeB") 

Muß ich einen anderen Austausch benutzen? Wie erreiche ich das gewünschte Szenario?

Antwort

4

können Sie erreichen, was Sie wollen, indem eine einzige QueueA mit mehreren Verbrauchern zu dieser Warteschlange abonniert werden:

Direct exchange 
| 
|-- ["TypeA"]--> QueueA 
|    |-- Consumer A1 
|    `-- Consumer A2 
| 
`-- ["TypeB"]--> QueueB 

In diesem Fall wird eine Meldung auf QueueA Warteschlange wird nur ein Verbraucher geliefert werden. Der Verbraucher, der die Nachricht erhält, ist jedoch undefiniert: Sie werden in einer Round-Robin-Art ausgewählt.

0

w/RabbitMQ, alle Routingschlüssel, die innerhalb einer bestimmten Exchange übereinstimmen, erhalten eine Kopie der Nachricht an die angegebene Warteschlange.

Also, in Ihrem Szenario haben Sie immer QueueA1 und QueueA2 erhalten Nachrichten von TypeA. So funktionieren Routing-Schlüssel. Es gibt keinen Weg, einen einzigen Austausch zu benutzen.

Wenn benötigen Sie QueueA1 und QueueA2 verschiedene Nachrichten zu empfangen, dann sind Sie entweder:

  • Notwendigkeit, verschiedene Routing-Schlüssel zu verwenden, um die Warteschlange zu binden, oder
  • müssen einen anderen Austausch verwenden

In Bezug auf den Vorschlag von Jean-Sebastient ...

Dieses Szenario kann entweder Consumer A1 oder Consumer A2, um die betreffende Nachricht zu bearbeiten, tut dies jedoch, indem sie beide die gleiche Warteschlange abonnieren.

Wenn Sie versuchen, sicherzustellen, dass es einen 1 Consumer gibt, der die Nachricht empfängt, dann möchten Sie das tun. Wenn Sie jedoch beide Warteschlangen benötigen und sicherstellen müssen, dass nur eine Warteschlange die Nachricht empfängt, müssen Sie eine der anderen vorgeschlagenen Optionen verwenden.

Schließlich, wenn Sie sicherstellen, dass eine Nachricht nur einmal verarbeitet wird, wird keine dieser Optionen das tun.

Auf der Oberfläche wird es so aussehen, wie dies die meiste Zeit funktioniert. Aber es wird Szenarien geben, in denen etwas schief geht und Sie mehr als eine Warteschlange oder einen Verbraucher dieselbe Nachricht verarbeiten lassen.

Um dieses Szenario zu behandeln, müssen Sie eine "Idempotenz" in Ihrer Nachrichtenbehandlung aussehen. Dies wird am häufigsten mit einer Datenbank und einer ID gehandhabt, um zu sagen, dass sie bereits verarbeitet wurde, aber es gibt andere Lösungen da draußen.

Verwandte Themen