Rabbit MQ Exchange and Exchange Types: What You Need to Know
An Exchange in RabbitMQ is a routing mechanism to send messages to queues. Let's learn about the Exchanges and the different types of Exchanges in RabbitMQ.
Table of Contents
An Exchange in RabbitMQ is a routing mechanism to send messages to queues.
The type of exchange determines how an Exchange sends the messages to Queues.
In this post let's learn
- What it A RabbitMQ Exchange?
- Binding and Routing Keys
- Different Exchange Types
I will use Amazon MQ, a managed message broker service that supports ActiveMQ and RabbitMQ engine types to host my RabbitMQ instance. However, you can use one of the various options that RabbitMQ provides to host your instance,
This article is sponsored by AWS and is part of my RabbitMQ Series.
What is A RabbitMQ Exchange?
Typically, when we think about Message-driven applications, we talk about the Producer (Publisher or Sender), Consumer (Receiver), and Queue.
The Producer sends messages to the Queue, and the Consumer picks up and processes messages from the Queue.
However, with RabbitMQ, the Producer does not send messages directly to a Queue.
Producer sends messages to an Exchange.
Exchanges are responsible for distributing the message copies to different Queues.
With the Exchange between the Producer and Consumer, we need to introduce two new concepts to connect them.
Binding and Routing Keys
A Binding connects an Exchange with a Queue.
You can think of this as a link or a rule instructing the Exchange on distributing the message copies to Queues.
A Routing Key is an attribute on a message that the Exchange looks at when deciding how to route the message to Queues.
Exchange and Bindings From a .NET Application
The .NET Channel instance has the ExchangeDeclare
method that lets us create a new Exchange by specifying an Exchange Name and also the Type.
channel.ExchangeDeclare(exchangeName, ExchangeType.Direct);
For now, I am using ExchangeType.Direct
which represents a Direct Exchange. We will soon learn about the different Exchange Types further in this post.
You can view the details of the Exchange and the associated bindings in the RabbitMQ Management Console.
Below is a snapshot from my AWS MQ-hosted Rabbit instance
The sender/publisher knows nothing about Queues.
The BasicPublish
method sends messages to an Exchange. It also supports sending the routing key for a message.
void SendMessage(IModel channel, string message, string routingKey)
{
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchangeName, routingKey, null, body);
Console.WriteLine($"[x] Send {message}");
}
On the Receiver side, we define the Bindings that connect this Exchange to appropriate Queues. The Consumers still pull work from these Queues.
The QueueBind
method takes in the Queue Name, Exchange Name, and the Binding Key to create a Binding that connects the Exchange with the Queue.
channel.QueueBind(queueName, exchangeName, bindingKey);
Exchange Types in RabbitMQ
With the messages flowing into the Exchange, we must start routing them to different Queues based on the application needs.
RabbitMQ supports four different Exchange Types.
Based on the Exchange Type, RabbitMQ routes the messages differently to its destination Queues.
Here, we will look at some high-level features of the different Exchange Types. We will cover each of them in detail in separate posts. (I'll link them here as I publish them)
Direct Exchange
A Direct Exchange routes messages to Queues with routing keys that exactly match the binding keys.
Route the message to a queue whose binding key matches exactly with the message's routing key.
You can have multiple bindings to the same queue and different queues for the same binding key. Learn more about Direct Exchange in the post below.
Fanout Exchange
A Fanout Exchange type routes all messages it receives to all the Queues bound to it. It does not look at the routing or binding key provided, if any.
Sends copies of messages to all the queues bound to it.
Fanout Exchange is a great choice where the same message needs to be sent to one or more queues. Consumers of each queue can process the messages differently.
Topic Exchange
Topic Exchanges route messages to queues based on wildcard matches on the routing key provided as part of the binding key on a binding.
Route messages to queues based on wild card matches between the routing key and the binding key.
Routing keys are a list of words delimited by the ‘.’ (Dot) symbol.
You can use two wild card patterns in the binding key as required.
- * (Star) → Matches one word in a specific position
- # (Hash) → Matches zero or more words
This gives flexibility to the consumers to filter down to messages they are interested in by using wildcard matching on the routing key.
Headers Exchange
A Header exchange is a type of exchange that routes messages based on message header attributes.
Routes messages to queues based on header attributes instead of routing keys.
Unlike direct or topic exchanges that use routing keys or patterns, a header exchange relies on the values in the message's header for routing.
Rahul Nath Newsletter
Join the newsletter to receive the latest updates in your inbox.