The failure that motivates it
Start with the failure that motivates this entire topic.
Your checkout service calls the email service straight after each order and waits. One afternoon the email provider slows to 30 second responses, checkout threads pile up waiting on it, the pool runs out, and now nobody can buy anything because a receipt is slow. A synchronous call chain ties your uptime to your weakest dependency.
What the queue breaks
Put a queue between them and that coupling breaks in three directions at once.
Time, because your producer adds a message in a few milliseconds and returns, whether the work happens now or in an hour. Scale, because producers and consumers grow independently, so a checkout spike just deepens the queue while the same four email workers drain it at their own pace. Failure, because if every consumer is down the messages simply wait, and processing resumes when they come back.
Notice what your customer experienced during all of that. Nothing.
Accept the price, which is that adding a message does not mean the work is done. Your producer gets told the broker has the message, not that anything happened.
Keep anything the caller needs an answer to out of the queue, like an authorisation check during checkout. Async work is for things nobody is waiting on: emails, thumbnails, webhooks, analytics.
Take the one honest health number your queue gives you, which is its depth. A growing queue means your consumers cannot keep up, and it grows quietly until somebody looks.
Alert on that depth and on the age of the oldest message. A queue hiding a two hour backlog is not decoupling anything. It is a delay line on an incident you have not noticed yet.
Worked example
Leah runs the backend for a ticketing site. When a mid-size artist announces a tour, checkout traffic jumps from 40 to 3,000 orders per minute for about ten minutes. The synchronous version of the pipeline, which generated PDF tickets and sent confirmations inline, fell over at 400 per minute during the last on-sale, and 90 minutes of orders needed manual fixes. Her team moves ticket generation and email onto RabbitMQ. On the next on-sale, checkout enqueues each order in 4 ms and returns instantly; the queue peaks at 21,000 messages while eight workers drain it at 600 per minute. Customers get tickets over the next half hour, checkout p99 never moves, and the only alert that fires is the intentional one saying queue depth exceeded 10,000.