# Prefetch, Fair Dispatch and Competing Consumers — RabbitMQ

Source: https://www.skillbyai.com/en/rabbitmq/c-prefetch

> Tune prefetch to balance throughput and fairness between workers.

## How many messages a consumer may hold

By default RabbitMQ pushes messages to consumers as fast as it can, round-robin. Without a limit, one consumer may receive thousands of messages it cannot process quickly while another sits idle, and a crash returns a huge batch to the queue. **`basic_qos(prefetch_count=N)`** sets how many **unacknowledged** messages a consumer may hold at once; once it has N unacked messages, the broker sends it nothing more until it acks some. A small prefetch (1 to 10) gives **fair dispatch** for slow, uneven jobs; a larger prefetch (tens to hundreds) improves **throughput** for fast, uniform messages by keeping the network pipe full. Scale throughput by adding consumers (**competing consumers**), within the same process or across machines. Keep in mind that more consumers on one queue means messages can be **processed out of order** relative to each other, even though the queue delivers them in order.

## Choosing prefetch

Start from processing time and tune with measurements.

```text
workload                                    suggested prefetch   why
------------------------------------------  -------------------  -------------------------------
slow jobs (seconds each, uneven)            1-5                  fair dispatch, small redelivery on crash
medium jobs (tens of ms)                    10-50                keeps workers busy
fast, uniform messages (sub-ms processing)  100-300              hides network round trips

never leave it unlimited for production consumers
rule of thumb: prefetch ~ (round-trip time / processing time per message) + a little
```

## Plates at a buffet counter

Prefetch is how many plates a server carries at once. Carrying one plate at a time is fair but slow; carrying fifty means some guests wait while one server juggles. A sensible stack keeps everyone served.

**Quiz:** What does basic_qos(prefetch_count=10) control?

- [ ] The maximum queue length
- [ ] The number of retries
- [ ] Message TTL in seconds
- [x] The maximum number of unacknowledged messages delivered to the consumer at once

*Answer:* The maximum number of unacknowledged messages delivered to the consumer at once. Prefetch limits in-flight unacked messages per consumer (or channel).
