Fire and Forget (Async)

Making things feel fast by doing the slow parts in the background.

The idea

When a user signs up for an app, you need to save them to the database and send a welcome email. Saving to the DB takes 10ms. Sending an email via SendGrid takes 800ms. If you do them synchronously, the user waits 810ms staring at a loading spinner. With Fire and Forget, you save to the DB, tell a background system to send the email, and instantly return a success message to the user in 10ms.

Step 1: The user clicks 'Sign Up'.

How it works (Background Tasks)

In most web frameworks, you cannot just launch a thread and forget it—if the server crashes, the task is lost forever. You use a Message Queue (like Redis + Celery/Sidekiq). You push a tiny JSON job to the queue, and a separate worker process reads it and actually sends the email.

# The synchronous way (Slow UX)
def sign_up():
    db.save_user(email)
    send_email(email) # ⚠ Blocks for 800ms
    return "Welcome!"

# The Fire and Forget way (Fast UX)
def sign_up():
    db.save_user(email)
    
    # ⚡ Pushes {"task":"email", "to": email} to Redis in 1ms
    send_email.delay(email) 
    
    return "Welcome!" # User gets response in 11ms

Cost

This drastically improves perceived latency (UX) and prevents web servers from being tied up waiting on third-party APIs. The trade-off is infrastructural complexity: you now have to deploy, monitor, and scale Redis and a fleet of worker processes.

Watch out for