Problems / Resilience, hard
Asked at Stripe and PayPal. The charges API writes the payment, then publishes a ledger event (two separate writes). At 10 s the ledger queue is down for 5 seconds; the ledger worker loses 2% of its acknowledgements and is not idempotent; at 18 s acquirer A is down for 10 seconds.
Unlock it once for 25 credits; everything inside it is free (runs, changes, Submit, results, hints). Sign in with Google to start; new accounts get free credits.
Success ≥ 99%, no duplicate side effects, no lost ledger events, for at most $1,100,000 a month (card fees included).
Like a coding problem, a solution has to pass every case, not just the one it was built for. Submit in the lab runs all 4; 1 of them are hidden until then.
800 requests a second for 20 seconds: 100% charge (writes).
What each component does in this design, and what calls it. The simulator mimics each one from these settings.
| Component | Its job here | Settings |
|---|---|---|
| Load balancerLoad balancer | Traffic enters here.Calls Charges API.Layer 4 balancers route by IP and port; layer 7 balancers read HTTP and can route by path or header. | – |
| Charges APIApp service | Load balancer forwards to it.Calls Payments (Postgres), Card network (acquirer A), Ledger events (publishes).Little's law: throughput ≈ concurrency ÷ latency. 200 slots at 50 ms serve about 4,000 req/s. | 4 replicas × 100 slots · timeout 9.0 s |
| Payments (Postgres)SQL database | Charges API calls it.Postgres runs one process per connection, which is why poolers like PgBouncer sit in front of busy databases. | 8 vCPU · 400 connections |
| Ledger eventsMessage queue | Charges API publishes to it.Calls Ledger and receipt worker.If a consumer does not finish within the visibility timeout, the message is delivered again. | – |
| Ledger and receipt workerWorker | Ledger events consumes from it.Queues deliver at least once, so a worker can see the same message twice. | 64 concurrent jobs |
| Card network (acquirer A)Payment gateway | Charges API calls it.Payment providers accept an idempotency key so a retried charge is not taken twice. | 500 slots |