How to create a delayed queue in RabbitMQ?
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Creating a delayed queue in RabbitMQ allows you to postpone the delivery of messages to a consumer until a specific point in time. This feature is particularly useful for scheduling tasks that should not be processed immediately but rather after a delay. RabbitMQ itself does not have built-in delayed queue functionality, but this can be achieved using the Delayed Message Plugin or by using a combination of TTL (Time-To-Live) and Dead-Letter Exchanges.
Using the RabbitMQ Delayed Message Plugin
Step 1: Install the Delayed Message Plugin
The first step is to install the plugin. You can download it from the RabbitMQ community plugins page and then install it with the following command:
Step 2: Create a Delayed Exchange
Once the plugin is enabled, create an exchange where messages can be published. This exchange will handle the delay.
Or using the management console:
- Go to the Exchanges tab,
- Click "Add a new exchange",
- Set the type to "x-delayed-message",
- In the arguments field, add a key
x-delayed-typeand set it to the underlying exchange type, usuallydirectortopic.
Step 3: Publish Messages with Delay
When publishing a message to this exchange, you need to add a header x-delay which is the delay time in milliseconds. Here’s how you can do this programmatically:
Using TTL and Dead-Letter Exchanges
Setup
- Create the Main Exchange and Queue: This is where messages will be initially sent.
- Configure a Dead-Letter Exchange and Queue: Messages from the main queue will move here when they expire.
- Set TTL for the Main Queue: Define how long messages should stay in the main queue before they move to the dead-letter queue, effectively creating a delay.
Step-By-Step Configuration
- Create the exchanges and queues:
- Set up the dead-lettering: You need to specify arguments for the main queue to use the dead-letter exchange.
- Set the TTL: This is the delay part. Messages will stay in the main queue for this period before being transferred to the dead-letter queue where they can be immediately consumed.
- Publish a message: Send a message to
main_exchange. It will route tomain_queue, stay there for the TTL period, then move todlx_queue.
Comparative Table
Here’s a table summarizing the options:
| Property | Delayed Message Plugin | TTL + Dead-Letter |
| Ease of setup | Moderate | Complex |
| Flexibility | High (per-message delay) | Low (fixed delay) |
| Maintenance | Requires plugin management | Native feature |
| Performance | Good | Good |
Conclusion
Whether you should use the Delayed Message Plugin or TTL and Dead-Letter Exchanges in RabbitMQ depends on your specific needs. If fine control over individual message delays is required, the plugin is preferable. For simpler, fixed-delay scenarios, using TTL and Dead-Letter Exchanges would suffice. Always consider factors like the complexity of setup and maintenance when making your choice.
Related reading
- How to create a kafka consumer group in Golang?
- How to Create a Kafka Consumer Record from a String to build Junit test case
- How to create a Kafka Topic using Confluent.Kafka .Net Client
- How to create a list of topics in Apache Kafka using single command
- How to create a density plot
- How to create a dictionary of two pandas DataFrame columns
- How to create a new consumer group in kafka
- How to create a queue in RabbitMQ upon startup

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.