pattern

Competing Consumers

Multiple identical consumers reading from one queue, so throughput scales with consumer count and work is distributed automatically.

scalingqueuesthroughput

The simplest horizontal scaling mechanism available for asynchronous work: add instances, they compete for messages, throughput rises. The queue also acts as the load balancer, with no coordination required.

The property you give up is ordering. Two messages for the same entity may be processed concurrently by different consumers, in either order. If order matters, you need partitioned consumption where a key always lands on the same consumer — which caps parallelism at the partition count and reintroduces a hot-partition risk.

Two operational essentials: a visibility timeout long enough for the slowest legitimate message, so a slow consumer's message is not redelivered and processed twice; and a redelivery limit feeding a dead letter queue, so a message that always fails does not cycle forever.