RabbitMQ pushes messages to a consumer up to the prefetch limit without waiting for acknowledgements. With the default of unlimited, one consumer takes the whole queue into its local buffer and the others sit idle.
$channel->basic_qos(
null, // prefetch size, in bytes — leave null
1, // prefetch count: one unacknowledged message at a time
null
);
A prefetch of 1 gives the fairest distribution and the most round trips, which is right when messages are slow and uneven. For fast, uniform messages a higher number amortises the network cost — 10 to 100 is the usual range. The failure it prevents is specific and common: three workers, one queue, and two of them doing nothing while the first works through a buffered thousand.