Every dot leaving the client is one HTTP request. It first meets the API Gateway, which enforces a token-bucket rate limiter: the bucket refills continuously and each request must spend one token to pass.
tokens(t) = min(capacity, tokens(t-dt) + refillRate * dt)
allowed = tokens >= 1 -> tokens -= 1
denied = tokens < 1 -> HTTP 429 Too Many Requests
capacity ~= 1.4 * refillRate (small burst allowance)
- Request rate — how many requests per second the client fires; push it past the rate limit to see 429s pile up.
- Gateway rate limit — the bucket's refill rate (tokens/s) and, scaled, its capacity — the sustainable throughput ceiling.
- Auth — when on, admitted requests are checked at an auth service; a fixed fraction fail with HTTP 401 before ever reaching a microservice.
- Chaos — when on, microservices randomly fail admitted, authenticated requests with HTTP 500, modelling real production flakiness.
Successful requests are routed to one of three microservices (Users / Orders / Payments), each backed by its own database, then the response travels all the way back to the client — the same round trip a browser or mobile app makes on every API call.