What is RabbitMQ, and what makes it one of the most popular message brokers out there?
My name is Whitney Lee.
I'm a Cloud Developer here at IBM.
Before I dig in, please, don't forget to hit that subscribe button.
So, let's travel back in time to the days of monolithic architecture.
Back then, application components were tightly coupled.
That means they were directly connected.
So, in a simple retail application, if we had a checkout service and it needed to communicate
with an inventory service, that would be done directly through,
usually through a TCP connection.
So, this had some limitations.
As soon as the checkout sent the message,
it would need to hear a reply before it could move on to the next task.
Or worse, if the inventory service went down, it would try over and over again
until it was able to make that connection.
Or, if a lot of checkouts happened at once the inventory service wouldn't be able to keep up
and the whole system would get bogged down.
So, that's why message queues were created -- or, message brokers --
and those will sit, a message queue sits in between the two services that need
to communication with one another.
So, with a message queue, a checkout can add a message to the queue
and then immediately move on to the next task.
And then similarly, the inventory, when it's ready, can consume from the queue,
process the message and then immediately consume the next message.
So, this is going to decouple the two applications.
A message broker is also going to help with scalability.
So, the inventory...if a lot of checkouts happen at once, the queue begins to fill,
you can have more than one consuming service -- more than one inventory, in our case --
to read from the queue to handle the amount of workload that the checkout is producing,
and that's going to make the system more scalable.
Another big benefit of message queues is that the queue itself can sit on its own machine.
So, in that case, it can offload some of the work that's done by the Web application
and make the whole system more performant.
So, let's talk about RabbitMQ.
RabbitMQ is an implementation of the AMQP message model --
that's Advanced Message Queueing Protocol -- and specifically, Version 091.
So, with this type of message model, the producer, in our case the checkout,
the service that produces the messages, instead of producing directly to a message queue,
it's going to produce to an exchange.
So, you can think of an exchange as a post office.
It's going to receive all the messages
and then distribute them according to how they're addressed.
An exchange could be connected to many queues; in our case, we're going to do two.
And then, the queues are connected to the consuming services or our consumers.
So, we'll have one called inventory
and then we'll do one called shipping might need to consume from a checkout.
So, the checkout will send a message to the exchange.
The exchange is connected to queues through connections called bindings,
and these bindings can be referenced by the binding key.
And then our consuming applications --
or, consumers, consuming services -- those subscribe to the queues.
So, AMQP, RabbitMQ this is the message broker here, this part of the system.
One thing that's great about this message model I the flexibility
with which the messages can move through the system, and that flexibility is largely in part
to the different types of exchanges available.
So, the first type of exchange that the system can do is a fanout exchange.
With a fanout exchange, checkout will produce to the exchange,
the exchange will duplicate the message and send it to every single queue that it knows about.
Or, we have a direct exchange.
With the direct exchange, the checkout will produce the message and then
that message will get a routing key.
So, with a direct exchange the routing key is being compared to the binding key;
and if it's an exact match, then the message will move through the system accordingly.
Next, we have a topic exchange.
With a topic exchange, we can do a partial match between the routing key and the binding key.
So, if we had a routing key on this message called ship.shoes
and the binding key was called ship.any and the exchange type was a topic exchange,
that message would get routed through to that, this queue.
There's also a header exchange.
With a header exchange, the routing key is ignored completely, and the message is moved
through the system according to the header.
And then finally, we have a default exchange.
This exchange is unique only to RabbitMQ.
It's not part of the AMQP message model.
So, the default exchange is also called a nameless exchange.
And with the default exchange, the routing key,
let's say the routing key of this message is inv.
The routing key is getting tied to the name of the queue itself.
So, if this queue is named inv, then the message would route through to there.
So, there are a couple of main benefits of RabbitMQ right now with the architecture,
and one is a tremendous amount of flexibility you have moving messages through your system.
In fact, they say you can design your system with whatever you want, the sky's the limit,
and then later configure it RabbitMQ to work with your system as opposed to needing
to know RabbitMQ's limitations and designing your system accordingly.
Also, with other message brokers the broker administrator when they set
up the message model, that's when all the configuration for how message moves
through the system, that's when it's all defined.
But with RabbitMQ, the way the message moves
through the system is largely a part of the message metadata.
So, in this case, it's the application and the developer that has a lot of control
with the way messages move through the system rather than the broker administrator.
Another great benefit to RabbitMQ is that it is cloud friendly.
It is easy to get started.
You can deploy an instance of it on Docker or other containerization software.
It also can run as a cluster, so that means it's fault tolerant,
highly available and has high throughput.
RabbitMQ can do cross language communication.
So, if a message is produced by a checkout and go, it can be consumed by inventory
in JavaScript and consumed by shipping in Python.
And really the possibilities are endless.
It has a very extensive library.
It has good security.
It supports FASL, LDAP and TLS for authentication and authorization.
It does message acknowledgements.
So, message acknowledgements, when a message is in a queue and it goes to the consumer,
the message stays in the queue until the consumer lets the broker know
that it has received the message.
And only then is the message taken out of the queue,
and that prevents the system from losing any messages.
It has great management.
So, right out of the box you have a really good browser based management UI
as well as incentive CLI tools.
Not only that, but the open source community has created plugins
that really enrich the management and moderning part of RabbitMQ.
And speaking of that open source community, it has created a lot of plugins
that can enrich most aspects of RabbitMQ.
There are many tools created, there are lots of clients,
it's so evolved that RabbitMQ now supports other message models.
So, not just AMQP 091 but you can do MQTT, Stomp, AMQP 1.0 for example.
So, this has been an overview of RabbitMQ.
The big takeaways for you are the flexibility with the ways the messages move
through the system; the fact that the message metadata defines how messages move
through the system as opposed to the broker administrator;
and then, it's also super cloud friendly.
Thank you.
If you have questions, please drop us a line below.
If you want to see more videos like this in the future, please like and subscribe.
And don't forget, you can grow your skills and earn a badge with IBM Cloud Labs which are free,
browser based, interactive Kubernetes labs.