Small catalog
300 products and a few hundred orders: a shop in its first months.
- Holds
- 17 req/s
- Breaks by
- 28.5 req/s
- Slowed first
- Add to cart
We run open-source applications on Railway and send them the traffic of real users. Then we look for the rate where each one stops keeping its promises. Every number below comes from a real Load Run.
Examples: real CapacityLab Load Runs against applications we host
We run an open-source shop (Medusa v2) on Railway and send it the traffic of real visits: browse, search, open a product, add to cart, pay. Then we look for the rate where it stops keeping its promises.
Each column is a capacity search. Green is the rate the shop held with every step inside its latency bound; the hatched stretch is where the limit lies; red is where it broke. The shops share the application and its limits, but their databases were not capped and warmed up differently, so the columns compare three observed setups, not the effect of data volume alone.
300 products and a few hundred orders: a shop in its first months.
50,000 products, 150,000 customers and 100,000 orders: a shop after a few busy years.
The large catalog under a sale-day visit mix at a steady rate: fewer browsers, more carts and orders per visit. It models the mix, not a sale-day traffic spike.
Every scenario sends the same kind of visit, step by step, the way a shopper moves through the store. The bars are each step's share of all requests in the small-catalog run; the Black Friday visit shifts weight from browsing to carts and orders at a steady rate, without a traffic spike.
GET /store/regions2.88%GET /store/product-categories8.63%GET /store/products28.8%GET /store/products11.5%GET /store/products/{product_id}38.9%POST /store/carts2.88%POST /store/carts/{cart_id}1.44%GET /store/shipping-options1.44%POST /store/carts/{cart_id}/shipping-methods1.44%POST /store/payment-collections0.72%POST /store/payment-collections/{payment_collection_id}/payment-sessions0.72%POST /store/carts/{cart_id}/complete0.72%We run a ride-hailing geo backend on Railway: Tile38 holds live driver positions and open orders, OSRM routes over the Moscow road graph, Photon geocodes addresses, and one Caddy front door sits before them. 20,000 synthetic drivers move around Moscow and ping their positions; between the pings, riders look for a car, get a route and a price, and some of them order.
Each column is a capacity search. Green is the rate the backend held with every call inside its latency bound; the hatched stretch is where the limit lies; red is where it broke.
20,000 drivers across Moscow send their positions; for every ten pings one rider looks for a car, and half of the riders order.
Twice the riders and three times the orders of a normal evening. Half of the dispatches find no car close enough and search again within 4 km, so more ETA tables are computed.
70% of riders stand within 800 m of the stadium and 30% of the pings come from drivers waiting there: one geo cell takes most of the load.
Every tick of a journey is a driver sending its position. Some ticks also serve a rider: geocode the destination, find drivers within 2 km, route and price the trip, check surge in the rider's cell and, when the rider orders, ask for ETAs from the nearest drivers and store the order. The bars are each call's share of all requests in the first taxi scenario; rain and the stadium change the mix and where in the city it lands.
GET /tile38/SET+fleet+d00001+POINT+55.7558+37.617366.7%GET /photon/api6.67%GET /tile38/NEARBY+fleet+LIMIT+5+POINTS+POINT+55.7558+37.6173+20006.67%GET /osrm/route/v1/driving/37.6173,55.7558;37.5537,55.71586.67%GET /tile38/NEARBY+orders+COUNT+POINT+55.7158+37.5537+10006.67%GET /osrm/table/v1/driving/37.6100,55.7500;37.6200,55.7600;37.6173,55.75583.33%GET /tile38/SET+orders+o0000000000000000+EX+900+POINT+55.7558+37.61733.33%Sign up with your email. Your new account opens with this report and every other demo report inside, ready to compare with your own first run.