Bird
Raised Fist0
RabbitMQdevops~10 mins

Topic exchange (pattern matching) in RabbitMQ - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Topic exchange (pattern matching)
Producer sends message with routing key
↓
Topic Exchange receives message
↓
Exchange compares routing key with binding keys
↓
Match?
↓
Route to queues
↓
Consumers receive messages from queues
Messages are sent with routing keys to a topic exchange, which routes them to queues whose binding keys match the routing key pattern.
Execution Sample
RabbitMQ
1. Producer sends message with routing key: "stock.usd.nyse"
2. Topic exchange has bindings:
   - Queue A: binding key "stock.*.*"
   - Queue B: binding key "stock.usd.#"
3. Exchange routes message based on pattern match
This example shows how a message with routing key "stock.usd.nyse" is routed to queues with matching binding keys using topic exchange pattern matching.
Process Table
StepRouting KeyBinding KeyMatch ResultActionQueues Routed
1stock.usd.nysestock.*.*YesRoute messageQueue A
2stock.usd.nysestock.usd.#YesRoute messageQueue B
3stock.usd.nysestock.eur.#NoDiscard for this binding-
4stock.usd.nysestock.#YesRoute messageQueue C (if exists)
5stock.usd.nyseother.bindingNoDiscard for this binding-
6---Routing completeQueues A, B, (C if exists)
💡 All bindings checked; message routed to all matching queues.
Status Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
Routing Key-stock.usd.nysestock.usd.nysestock.usd.nysestock.usd.nyse
Binding Key-stock.*.*stock.usd.#stock.eur.#-
Match Result-YesYesNo-
Queues Routed-Queue AQueue A, Queue BQueue A, Queue BQueue A, Queue B
Key Moments - 3 Insights
Why does the binding key 'stock.*.*' match 'stock.usd.nyse'?
Because '*' matches exactly one word in the routing key, so 'stock.*.*' matches 'stock.usd.nyse' where 'usd' and 'nyse' are the two words matched by '*'. See execution_table row 1.
Why does 'stock.usd.#' match the routing key?
'#' matches zero or more words, so 'stock.usd.#' matches any routing key starting with 'stock.usd', including 'stock.usd.nyse'. See execution_table row 2.
What happens if no binding keys match the routing key?
The message is discarded or dead-lettered because no queues are bound with matching patterns. See execution_table row 5.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, which binding key does NOT match the routing key 'stock.usd.nyse'?
Astock.eur.#
Bstock.usd.#
Cstock.*.*
Dstock.#
💡 Hint
Check the 'Match Result' column in execution_table rows 1-5.
At which step does the message get routed to Queue B?
AStep 1
BStep 2
CStep 3
DStep 5
💡 Hint
Look at the 'Queues Routed' column in execution_table for when Queue B appears.
If the routing key was 'stock.eur.london', which binding key would match?
Astock.usd.#
Bstock.eur.#
Cstock.*.*
Dother.binding
💡 Hint
Refer to how '#' matches zero or more words in binding keys from key_moments.
Concept Snapshot
Topic Exchange routes messages by matching routing keys to binding keys using patterns.
'*' matches exactly one word.
'#' matches zero or more words.
Messages route to all queues with matching binding keys.
Non-matching messages are discarded.
Full Transcript
In RabbitMQ, a topic exchange routes messages based on pattern matching between the message's routing key and the binding keys of queues. The routing key is a string with words separated by dots. Binding keys can include '*' to match exactly one word and '#' to match zero or more words. When a message arrives, the exchange compares the routing key to each binding key. If they match, the message is routed to the corresponding queue. If no binding keys match, the message is discarded. For example, a routing key 'stock.usd.nyse' matches binding keys like 'stock.*.*' and 'stock.usd.#'. This allows flexible routing based on patterns.

Practice

(1/5)
1. What is the main purpose of a topic exchange in RabbitMQ?
easy
A. To broadcast messages to all queues regardless of routing keys
B. To store messages until consumers are ready
C. To route messages based on pattern matching of routing keys
D. To encrypt messages before sending

Solution

  1. Step 1: Understand the role of exchanges in RabbitMQ

    Exchanges route messages to queues based on rules. Topic exchanges use patterns in routing keys.
  2. Step 2: Identify the unique feature of topic exchanges

    Topic exchanges route messages by matching routing keys with patterns containing * and # wildcards.
  3. Final Answer:

    To route messages based on pattern matching of routing keys -> Option C
  4. Quick Check:

    Topic exchange = pattern matching routing [OK]
Hint: Topic exchange uses wildcards to match routing keys [OK]
Common Mistakes:
  • Confusing topic exchange with fanout exchange
  • Thinking topic exchange stores messages
  • Assuming topic exchange encrypts messages
2. Which of the following is the correct syntax to bind a queue named logs to a topic exchange named topic_logs with routing key pattern kern.* using RabbitMQ CLI?
easy
A. rabbitmqadmin declare binding source=topic_logs destination=logs routing_key=kern.*
B. rabbitmqctl bind queue=logs exchange=topic_logs routing_key=kern.*
C. rabbitmqadmin bind queue=logs exchange=topic_logs routing_key=kern.*
D. rabbitmqctl declare binding source=topic_logs destination=logs routing_key=kern.*

Solution

  1. Step 1: Identify the correct RabbitMQ CLI tool for binding

    Binding queues to exchanges is done with rabbitmqadmin declare binding, not rabbitmqctl.
  2. Step 2: Check the correct parameters for binding

    The correct parameters are source for exchange, destination for queue, and routing_key for pattern.
  3. Final Answer:

    rabbitmqadmin declare binding source=topic_logs destination=logs routing_key=kern.* -> Option A
  4. Quick Check:

    Use rabbitmqadmin declare binding with source, destination, routing_key [OK]
Hint: Use rabbitmqadmin declare binding with source and destination [OK]
Common Mistakes:
  • Using rabbitmqctl instead of rabbitmqadmin for binding
  • Swapping source and destination parameters
  • Omitting routing_key parameter
3. Given a topic exchange with a queue bound using the routing key pattern *.orange.*, which routing keys will deliver messages to this queue?
medium
A. quick.orange.rabbit, orange
B. orange.rabbit, quick.orange
C. quick.orange, orange.lazy.rabbit
D. quick.orange.rabbit, lazy.orange.elephant

Solution

  1. Step 1: Understand the pattern *.orange.*

    The pattern means exactly three words separated by dots, with 'orange' as the middle word. The * matches exactly one word.
  2. Step 2: Check each routing key against the pattern

    quick.orange.rabbit, lazy.orange.elephant keys: 'quick.orange.rabbit' and 'lazy.orange.elephant' both have three words with 'orange' in the middle, so they match.
  3. Final Answer:

    quick.orange.rabbit, lazy.orange.elephant -> Option D
  4. Quick Check:

    Pattern *.orange.* matches three-word keys with orange in middle [OK]
Hint: Count words; * matches one word, # matches zero or more [OK]
Common Mistakes:
  • Assuming * matches zero or multiple words
  • Ignoring word count in routing key
  • Confusing * with # wildcard
4. You have a queue bound to a topic exchange with the routing key pattern stock.#. Messages with routing key stock.us.nyse are not delivered to the queue. What is the most likely cause?
medium
A. The exchange type is not set to topic
B. The routing key pattern stock.# does not match stock.us.nyse
C. The queue is not bound correctly to the exchange
D. The message was published with an empty routing key

Solution

  1. Step 1: Verify the exchange type

    The pattern stock.# matches routing keys starting with 'stock' followed by zero or more words. If messages are not delivered, the exchange might not be a topic exchange.
  2. Step 2: Check other possible causes

    Binding and routing key pattern are correct. If the exchange is not topic type, pattern matching won't work.
  3. Final Answer:

    The exchange type is not set to topic -> Option A
  4. Quick Check:

    Topic exchange required for pattern matching [OK]
Hint: Ensure exchange type is topic for pattern matching [OK]
Common Mistakes:
  • Assuming binding is always correct without verification
  • Thinking # wildcard doesn't match multiple words
  • Ignoring exchange type setting
5. You want to receive all messages related to any fruit except those about apples or bananas using a topic exchange. Which binding key pattern should you use?
hard
A. *.fruit.*
B. #.fruit.# and bind separate queues for apple and banana to discard
C. #.fruit.# but exclude apple and banana keys manually
D. #.fruit.#

Solution

  1. Step 1: Understand topic exchange limitations

    Topic exchanges route messages by matching patterns but cannot exclude specific keys directly in binding patterns.
  2. Step 2: Plan a solution using multiple queues

    Bind one queue with #.fruit.# to get all fruit messages. Bind separate queues for apple and banana keys to handle or discard them separately.
  3. Step 3: Implement exclusion by filtering in consumers or separate queues

    Since exclusion is not supported in binding keys, use separate queues or consumer logic to exclude apples and bananas.
  4. Final Answer:

    #.fruit.# and bind separate queues for apple and banana to discard -> Option B
  5. Quick Check:

    Exclusion requires separate queues or consumer filtering [OK]
Hint: Topic exchange can't exclude keys; use separate queues [OK]
Common Mistakes:
  • Trying to exclude keys using binding patterns
  • Assuming * or # can exclude specific words
  • Not using multiple queues or consumer filtering
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard