RabbitMQ throttling fast producer against large queues with slow consumer
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
RabbitMQ can efficiently handle high throughput scenarios but may struggle when there's a mismatch between the speed of the producing and consuming processes. In situations where the producer sends messages more quickly than the consumer can handle them, it leads to a buildup of messages within the queue, which can result in increased latency, high memory usage, and even loss of messages if the broker runs out of memory or if messages are configured to be volatile.
Understanding the Problem
In a typical RabbitMQ setup, producers send messages to a queue from which consumers pull messages for processing. When a producer is faster, the queue grows in size, possibly overwhelming the consumer that cannot keep pace. This can negatively impact the overall performance and reliability of the system.
Throttling Techniques
Throttling the producers can prevent the system from being overwhelmed. Here are the commonly used techniques for managing the rate at which producers send messages:
Publisher Confirms (Acknowledgments)
RabbitMQ offers a feature known as Publisher Confirms. This mechanism provides an acknowledgement from the broker to the producer once messages are safely stored in the queue. You can leverage this feature to monitor the number of unacknowledged messages. By setting a limit (a "watermark"), producers can pause and wait for acknowledgments before publishing more messages.
Example: Limit the unacknowledged message count to control the publishing rate.
Consumer Feedback
In this approach, the consumer sends feedback about its processing capabilities, which can be used by the producer to adjust its publishing rate.
Example: Using RPC calls or a dedicated feedback queue where consumers report their status.
Resource Monitoring
Monitoring queue length and dynamically adjusting the producer's rate based on the current length can also be an effective strategy.
Example: Periodically checking the queue size:
Additional Considerations
Quality of Service (QoS)
RabbitMQ's QoS settings at the channel level can limit how many messages the server delivers to consumers before an acknowledgement is received. It’s mostly used to prevent overwhelming a consumer by imposing a limit on the server side.
Example:
Dead Letter Exchanges
For messages that cannot be processed immediately or are rejected, configuring a Dead Letter Exchange (DLX) can help manage the message flow and avoid clogging the primary processing queue.
Priority Queues
Implementing priority queues can help in managing messages that need immediate processing over others, thus indirectly assisting in managing backpressure scenarios.
Table: Summary of Throttling Techniques
| Technique | Description | Use Case |
| Publisher Confirms | Limiting message send based on ack from broker. | When precise control over message flow is needed. |
| Consumer Feedback | Adjust sending rate based on consumer’s processing ability | Variable consumer speeds. |
| Resource Monitoring | Adjusting based on queue metrics | When system metrics are critical for performance. |
| Quality of Service (QoS) | Limits number of unack'd messages delivered to consumers | To prevent consumer overload. |
Conclusion
In high throughput systems where producers can potentially overwhelm consumers, employing throttling mechanisms such as publisher confirms, consumer feedback, resource monitoring, and proper RabbitMQ configurations like QoS and DLX, can help maintain a balanced message flow and system stability. Each method has its context of applicability and can be combined depending on the specific requirements and behaviors of the production and consumption patterns.
Related reading
- RabbitMQ Topic exchanges 1 Exchange vs Many Exchanges
- RabbitMQ undefined There is no template at js/tmpl/login.ejs
- RabbitMQ use of immediate and mandatory bits
- RabbitMQ user permission format
- RabbitMQ user permission to pub/sub on a pre-created queue
- RabbitMQ What is the default x-message-ttl value
- RabbitMQ using custom headers to store message-parameters
- RabbitMQ Verify version of rabbitmq

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.