How does RabbitMQ actually store the message physically?

syko picture syko · Jul 18, 2016 · Viewed 19.6k times · Source

I want to know how does RabbitMQ store the messages physically in its RAM and Disk?

I know that RabbitMQ tries to keep the messages in memory (But I don't know how the messages are put in the Ram). But the messages can be spilled into disk when the messages are with persistent mode or when the broker has the memory pressure. (But I don't know how the messages are stored in Disk.)

I'd like to know the internals about these. Unfortunately, the official documentation in its homepage do not expose the internal details.

Which document should I read for this?

Answer

Gabriele picture Gabriele · Jul 19, 2016

RabbitMQ uses a custom DB to store the messages, the db is usually located here:

/var/lib/rabbitmq/mnesia/rabbit@hostname/queues

Starting form the version 3.5.5 RabbitMQ introduced the new New Credit Flow https://www.rabbitmq.com/blog/2015/10/06/new-credit-flow-settings-on-rabbitmq-3-5-5/

Let’s take a look at how RabbitMQ queues store messages. When a message enters the queue, the queue needs to determine if the message should be persisted or not. If the message has to be persisted, then RabbitMQ will do so right away[3]. Now even if a message was persisted to disk, this doesn’t mean the message got removed from RAM, since RabbitMQ keeps a cache of messages in RAM for fast access when delivering messages to consumers. Whenever we are talking about paging messages out to disk, we are talking about what RabbitMQ does when it has to send messages from this cache to the file system.

This post blog is enough detailed.

I also suggest to read about lazy queue: https://www.rabbitmq.com/lazy-queues.html and https://www.rabbitmq.com/blog/2015/12/28/whats-new-in-rabbitmq-3-6-0/

Lazy Queues This new type of queues work by sending every message that is delivered to them straight to the file system, and only loading messages in RAM when consumers arrive to the queues. To optimize disk reads messages are loaded in batches.