Async Systems
Design for work that finishes after the initial request. · Technical Fluency · Lesson 28 · 3 min
Async Systems · 3 min
Situation
The upload is complete; processing is not.
A user uploads a large file. Storing the bytes takes seconds, but extracting and validating its contents takes minutes.
Keeping the user waiting on one network request makes failures hard to recover from. An asynchronous design can acknowledge the upload and complete processing separately.
Mental model
Separate acceptance from completion.
A queue holds work for later processing. A background worker takes jobs from it. A scheduled job runs at a planned time. A webhook is an HTTP notification sent to another system when an event occurs.
These mechanisms have different purposes. A payment webhook informs your product about an event; a queue can help your product process that event reliably.
Example
Give the work a durable identity.
Return a job ID and a pending state. Let the user see processing, completion, or failure, and retrieve the result later. Sending an email can be a separate background task.
If the tab closes, the work should not disappear merely because the interface is gone. Define how long results remain available and who can access them.
Failure case
Events may arrive twice or out of order.
A sender may retry a webhook because it did not receive an acknowledgement. A worker can fail after performing an action but before recording success.
Ask how the system recognizes duplicate work, retries safely, verifies webhook authenticity, and handles events that arrive in an unexpected order. “Async” does not mean automatic reliability.
PM decision
Make waiting and recovery part of the product.
Set expectations using observed processing times, not invented countdowns. Explain partial results and whether retrying restarts or resumes work.
Define who owns stuck jobs and how support identifies them. For a payment, avoid treating a browser redirect alone as definitive confirmation of the transaction state.
Remember this
Accepted, processing, and complete are different states.
An asynchronous architecture changes the UX contract. Give users a durable status, safe retries, and a clear way to recover when background work fails.