RabbitMQ durable queue does not work (RPC-Server, RPC-Client)
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
RabbitMQ is a popular open-source message broker used to facilitate the asynchronous communication between distributed systems through messaging. A critical feature in RabbitMQ, especially in production environments, is the concept of "durable" queues, which ensure messages are not lost even if the broker restarts or encounters a failure. This durability is especially pertinent when implementing Remote Procedure Call (RPC) patterns, where the client and server exchange messages for specific requests and responses.
Understanding Durable Queues in RabbitMQ
A queue in RabbitMQ is declared durable by setting the durable property to true. This ensures that the queue definition is persisted on the disk and will be reloaded if the RabbitMQ server restarts. However, the durability of the queue does not automatically make the messages stored within durable; messages themselves need to be marked as persistent.
For RPC implementations, where a client sends a request message and a server sends back a response, ensuring both the queues and messages are durable is crucial for reliability.
Common Misconfigurations
Several issues might cause it to appear as though durable queues are not functioning:
- Non-Persistent Messages: Even if a queue is durable, messages sent to it can be lost unless they are also marked as persistent. Message persistence guarantees that messages are stored to disk.
- Misconfigured Queue Parameters: If the queue is not declared as durable on both the RPC client and RPC Server, or if there is a mismatch in the configurations, the queue will not behave as expected.
- Broker Restart Timing: If the RabbitMQ service restarts while messages are only in memory (e.g., sent but not yet persisted), those messages can be lost.
- Acknowledgement Mistakes: Not using or improperly handling message acknowledgements can lead to lost messages. Automatic acknowledgment might lead to message loss if a consumer dies before it finishes processing.
Example Scenario: RPC with Durable Queue
Let’s consider an example where both the RPC client and server are using a durable queue.
RPC Server Setup
RPC Client Setup
Key Points Summary
| Feature | Configuration | Impact on Durability |
| Queue Declaration | durable=True | Queue will survive broker restarts |
| Message Sending | delivery_mode=2 | Message marked as persistent |
| Consume Method | auto_ack=True/False | Proper acks ensure message delivery status |
Conclusion
While RabbitMQ's durable queues are designed to ensure high reliability and consistency across message passing, proper configuration and understanding are crucial to utilize them fully. Misunderstandings and overlooks in settings like message persistence and queue durability can lead to apparent data losses, especially noticeable in systems like RPC servers and clients where every message is critical. Ensuring that both messages and queues are correctly configured will help maintain the integrity and reliability of applications using RabbitMQ for RPC or other messaging patterns.
Related reading
- RabbitMQ enagle feature flags before run server
- RabbitMQ, Erlang How to make sure the erlang cookies are the same
- RabbitMQ erl.exe taking high CPU usages
- RabbitMQ Error 530 vhost not found with pika
- RabbitMQ Failed to declare queue and Listener is not able to get queue on server
- RabbitMQ fails to start
- Rabbitmq error [Errno 10054] An existing connection was forcibly closed by the remote host
- RabbitMQ Error fwrite() send of 12 bytes failed with errno=104 Connection reset by peer

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.