Bird
Raised Fist0
RabbitMQdevops~10 mins

Binding keys and routing keys in RabbitMQ - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Binding keys and routing keys
Producer sends message with Routing Key
↓
Exchange receives message
↓
Exchange compares Routing Key with Binding Keys
↓
Match Binding Key
↓
Route to Queue
↓
Consumer receives message
Messages are sent with a routing key to an exchange, which routes them to queues whose binding keys match the routing key.
Execution Sample
RabbitMQ
Producer sends message with routing key 'info'
Exchange has bindings: 'info', 'error'
Exchange routes message to queues with matching binding keys
This example shows how a message with routing key 'info' is routed to queues bound with 'info'.
Process Table
StepRouting KeyBinding Key CheckedMatch?ActionResulting Queue
1infoinfoYesRoute messageQueue1
2infoerrorNoIgnore-
3infoinfo.*NoIgnore-
4infoinfo.#YesRoute messageQueue3
5infoerror.*NoIgnore-
6infoerror.#NoIgnore-
7info-No more bindingsStop routing-
💡 All binding keys checked; message routed to matching queues Queue1 and Queue3
Status Tracker
VariableStartAfter 1After 2After 3After 4After 5After 6Final
Routing Keyinfoinfoinfoinfoinfoinfoinfoinfo
Binding Key-infoerrorinfo.*info.#error.*error.#-
Match Result-YesNoNoYesNoNo-
Queues Routed[][Queue1][Queue1][Queue1][Queue1, Queue3][Queue1, Queue3][Queue1, Queue3][Queue1, Queue3]
Key Moments - 3 Insights
Why does the message route to Queue3 even though the binding key is 'info.#'?
Because 'info.#' matches routing keys starting with 'info' followed by zero or more words, so 'info' matches 'info.#' as shown in execution_table row 4.
Why is there no match with 'info.*' binding key?
'info.*' matches routing keys with exactly two words starting with 'info', but 'info' is a single word, so no match occurs (execution_table row 3).
What happens if no binding keys match the routing key?
The message is discarded or ignored by the exchange, as shown in execution_table row 7 where no more bindings match.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, which binding key first matches the routing key 'info'?
A'info'
B'error'
C'info.*'
D'error.#'
💡 Hint
Check the 'Match?' column in execution_table row 1.
At which step does the routing key match a binding key with a wildcard?
AStep 2
BStep 3
CStep 4
DStep 6
💡 Hint
Look for binding keys with '#' or '*' wildcards in execution_table.
If the routing key was 'info.update', which binding key would match?
A'info'
B'info.*'
C'error.#'
D'error'
💡 Hint
Refer to how 'info.*' matches routing keys with two words starting with 'info'.
Concept Snapshot
Binding keys connect queues to exchanges.
Routing keys label messages sent to exchanges.
Exchange routes messages to queues where binding keys match routing keys.
'*' matches exactly one word; '#' matches zero or more words.
Messages with no matching binding keys are discarded.
Full Transcript
In RabbitMQ, messages are sent with routing keys to an exchange. The exchange checks each binding key attached to queues. If the routing key matches a binding key, the message is routed to that queue. Binding keys can include wildcards: '*' matches exactly one word, '#' matches zero or more words. For example, a routing key 'info' matches binding keys 'info' and 'info.#' but not 'info.*'. If no binding keys match, the message is discarded. This process ensures messages reach the correct queues based on their routing keys.

Practice

(1/5)
1. What is the main purpose of a binding key in RabbitMQ?
easy
A. To label messages for routing
B. To create a new exchange
C. To connect a queue to an exchange and filter messages
D. To delete a queue

Solution

  1. Step 1: Understand the role of binding keys

    Binding keys link queues to exchanges and decide which messages the queue receives.
  2. Step 2: Differentiate from routing keys

    Routing keys label messages, but binding keys filter messages for queues.
  3. Final Answer:

    To connect a queue to an exchange and filter messages -> Option C
  4. Quick Check:

    Binding key = filter for queues [OK]
Hint: Binding keys link queues to exchanges filtering messages [OK]
Common Mistakes:
  • Confusing binding keys with routing keys
  • Thinking binding keys create exchanges
  • Assuming binding keys delete queues
2. Which of the following is the correct syntax to bind a queue named myQueue to an exchange myExchange with a binding key key.* using RabbitMQ CLI?
easy
A. rabbitmqadmin declare binding source=myExchange destination=myQueue routing_key=key.*
B. rabbitmqctl bind_queue myExchange myQueue key.*
C. rabbitmqctl declare binding myQueue myExchange key.*
D. rabbitmqadmin bind myQueue myExchange key.*

Solution

  1. Step 1: Identify the correct RabbitMQ CLI command

    The rabbitmqadmin declare binding command is used to create bindings with source, destination, and routing_key parameters.
  2. Step 2: Match parameters to syntax

    Source is the exchange, destination is the queue, and routing_key is the binding key pattern.
  3. Final Answer:

    rabbitmqadmin declare binding source=myExchange destination=myQueue routing_key=key.* -> Option A
  4. Quick Check:

    Use rabbitmqadmin declare binding with source, destination, routing_key [OK]
Hint: Use rabbitmqadmin declare binding with source, destination, routing_key [OK]
Common Mistakes:
  • Using rabbitmqctl bind_queue which is not a valid command
  • Swapping queue and exchange names
  • Omitting routing_key parameter
3. Given a topic exchange with a queue bound using binding key logs.*.error, which routing key will deliver a message to this queue?
medium
A. logs.system.error
B. logs.error.system
C. logs.system.warning
D. error.logs.system

Solution

  1. Step 1: Understand the binding key pattern

    The binding key logs.*.error matches routing keys with three words where the first is 'logs', the second can be any word, and the third is 'error'.
  2. Step 2: Match each option to the pattern

    logs.system.error: 'logs.system.error' matches exactly.
    logs.error.system: 'logs.error.system' ends with 'system', not 'error'.
    logs.system.warning: 'logs.system.warning' ends with 'warning', not 'error'.
    error.logs.system: 'error.logs.system' does not start with 'logs'.
  3. Final Answer:

    logs.system.error -> Option A
  4. Quick Check:

    Binding key pattern matches routing key exactly [OK]
Hint: Match binding key wildcards to routing key words [OK]
Common Mistakes:
  • Ignoring position of words in routing key
  • Confusing '*' wildcard with '#' wildcard
  • Assuming partial matches are enough
4. You have a queue bound to a topic exchange with binding key data.#. You send a message with routing key data but it is not received by the queue. What is the likely cause?
medium
A. Binding key data.# does not match routing key data
B. Routing key data should be data.#
C. Queue is not bound to the exchange
D. Binding key data.# matches routing key data, so the problem is elsewhere

Solution

  1. Step 1: Check if binding key matches routing key

    The binding key data.# matches routing keys starting with 'data' and zero or more words after. The routing key 'data' matches because '#' can match zero words.
  2. Step 2: Consider other causes

    Since the binding key matches, the message not arriving is likely due to other issues like queue not bound or exchange type mismatch.
  3. Final Answer:

    Binding key data.# matches routing key data, so the problem is elsewhere -> Option D
  4. Quick Check:

    Binding key '#' matches zero or more words [OK]
Hint: Remember '#' matches zero or more words including none [OK]
Common Mistakes:
  • Thinking '#' requires at least one word
  • Assuming routing key must equal binding key exactly
  • Ignoring other configuration issues
5. You want to route messages with routing keys order.created and order.updated to a queue named orderQueue using a topic exchange. Which most specific binding key should you use to receive both types of messages?
hard
A. order.created, order.updated
B. order.*
C. *.created, *.updated
D. order.#

Solution

  1. Step 1: Understand routing keys and binding keys

    Routing keys are 'order.created' and 'order.updated'. The binding key must match both.
  2. Step 2: Analyze each binding key option

    order.*: 'order.*' matches 'order.created' and 'order.updated' because '*' matches exactly one word.
    order.#: 'order.#' matches these and more, but is broader than needed.
    *.created, *.updated: '*.created, *.updated' do not match because the first word must be 'order'.
    order.created, order.updated: 'order.created, order.updated' is not valid syntax for a single binding key; multiple bindings needed.
  3. Final Answer:

    order.* -> Option B
  4. Quick Check:

    'order.*' matches 'order.created' and 'order.updated' [OK]
Hint: Use 'order.*' to match one word after 'order' [OK]
Common Mistakes:
  • Using '#' when '*' is enough
  • Trying to use multiple keys in one binding key string
  • Misplacing wildcards in binding keys
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