Start here. This is the direct spoken answer to practice first.
Why this question matters
Competing consumers increase parallel processing only until a downstream dependency or ordering rule becomes the real bottleneck. Worker count, prefetch, and concurrency must follow the capacity of the complete processing path.
Competing consumers means multiple worker instances read from the same queue, and each message is handled by one worker. It helps throughput because more workers can process messages in parallel. I would use it for independent jobs where order between messages does not matter much. The queue coordinates work distribution, while each handler still needs idempotency because retries or lock loss can redeliver a message.