RabbitMQ is a highly versatile open-source distributed message broker that excels in efficient message delivery, particularly in complex routing scenarios.
The system typically operates as a cluster of nodes, where queues are distributed and replicated for both high availability and fault tolerance. This robust and versatile messaging system provides developers with the flexibility to configure both durable and in-memory queues, making it possible to balance performance and reliability as required.
In addition, RabbitMQ is available in both open-source and commercial versions, allowing for seamless operation across all major operating systems.
Let us look at commonly used terms in the context of RabbitMQ or any other queuing system:
Producer/Publisher: The client component responsible for writing or sending messages to the queue.
Queue: An in-memory buffer that stores messages from the moment they are sent to the queue until a consumer application reads them off.
Consumer/Subscriber: The client component that receives or reads messages off the queue.
In the case of RabbitMQ, the producer/publisher never publishes any messages to the queue, but it actually writes the messages to an exchange which in turn further pushes the messages into the queue, based on the exchange type and routing key.
RabbitMQ offers a wide range of exchanges, allowing developers to address a multitude of implementation challenges. These exchanges provide developers with a range of options to choose from, enabling them to select the exchange type that best meets their specific requirements.
For this type of exchange, a routing key is bound to the queue, serving as a passkey that directs messages to the intended queue. Every message that is published to the exchange is associated with a routing key that determines the destination queue that the exchange writes it to.
For instance, in the preceding diagram, the message is written to the green queue because the message routing key "green" is bound to the green queue.
A Fanout Exchange, also referred to as a broadcast exchange, distributes messages to all the queues bound to it. When a message is published to a Fanout Exchange, it is sent to every queue that is bound to the exchange.
The preceding diagram demonstrates how a Fanout Exchange operates, where the message published by the producer is sent to all three queues: green, red, and orange. In essence, each queue bound to the exchange receives a copy of the message. This exchange mechanism is analogous to the pub-sub broker pattern.
In a topic exchange, messages are sent to all the queues whose routing key matches all or a portion of the routing key of the published message. For instance, if we publish a message to a topic exchange with a routing key of "green.red," then the message would be published to both the green and red queues. The following diagram provides a visual representation of the topic exchange mechanism.
The message routing key is "first.green.fast" and with topic exchange it's published onto the "green" queue because the word green occurs in there, the "red.fast" queue because the word fast occurs in there, and the "*.fast" queue because the word "fast" occurs in there.
A Headers Exchange publishes messages to specific queues by matching the message headers with the headers of the bound queues. This exchange is similar to a topic-based exchange but differs in the sense that it supports more than one matching criteria with complex ordered conditions.
The message published in the previous exchange is associated with a key "key1" that maps to a value "value1". The exchange matches this key-value pair against all the bindings in queue headers, and the criteria match with the first header value in the first queue, which maps to "key1" and "value1". Therefore, the message gets published only to the first queue. It's worth noting that the match criteria, in this case, is "any". The bottom queue has the same key-value pair as the first queue, but the match criteria are "all", which means that both mappings must match. As a result, the message is not published to the bottom queue.
Features of RabbitMQ
RabbitMQ's key features include:
Reliability: Features such as Persistence, delivery feedback, publisher confirmations, and high availability ensure high performance.
Built-in Clustering: RabbitMQ's clustering allows for linear messaging throughput expansion and fault tolerance.
Security: RabbitMQ offers secure client connections and user access controls for high-level message isolation.
Flexible Routing: RabbitMQ provides various built-in exchange types for routing, and users can develop their exchange type as a plugin or tie exchanges together for complicated routing.
RabbitMQ Use Cases
Complex Routing – if you want to route messages among many consuming apps like in a microservices architecture, RabbitMQ can be your best choice. RabbitMQ consistent hash exchange can balance load processing across a distributed monitoring service. You can also use alternate exchanges to route specific portions of events to specific services for A/B testing.
Legacy Applications – another use case of RabbitMQ is to deploy it using available plugins (or building your own plugin) for connecting consumer apps to legacy apps. For example, communicate with JMS apps using Java Message Service (JMS) plug-in and JMS client library.
In this article, we've discussed what is RabbitMQ, the exchanges that are supported by RabbitMQ and their explanations, the features that are offered by RabbitMQ and its use cases.
In our next post, we'll learn how to set up RabbitMQ. Keep watch!