Demo reports

Real load reports from apps we run ourselves

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

One shop, three situations

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.

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

Large catalog

50,000 products, 150,000 customers and 100,000 orders: a shop after a few busy years.

Holds
22.5 req/s
Breaks by
30.7 req/s
Slowed first
Search

Black Friday

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.

Holds
30.3 req/s
Breaks by
35.3 req/s
Slowed first
Search

The visit we replay

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.

  1. Load the regionGET /store/regions
  2. Open categoriesGET /store/product-categories
  3. Browse the catalogGET /store/products
  4. SearchGET /store/products
  5. Open a productGET /store/products/{product_id}
  6. Add to cartPOST /store/carts
  7. Enter the addressPOST /store/carts/{cart_id}
  8. See shipping optionsGET /store/shipping-options
  9. Choose shippingPOST /store/carts/{cart_id}/shipping-methods
  10. Start paymentPOST /store/payment-collections
  11. Open the payment sessionPOST /store/payment-collections/{payment_collection_id}/payment-sessions
  12. Place the orderPOST /store/carts/{cart_id}/complete

One taxi backend, three evenings

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.

Normal evening

20,000 drivers across Moscow send their positions; for every ten pings one rider looks for a car, and half of the riders order.

Holds
800 req/s
Breaks by
—

Rush hour in rain

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.

Holds
800 req/s
Breaks by
—

Match at Luzhniki

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.

Holds
320 req/s
Breaks by
not established

The journey we replay

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.

  1. Driver position pingGET /tile38/SET+fleet+d00001+POINT+55.7558+37.6173
  2. Geocode the destinationGET /photon/api
  3. Find drivers nearbyGET /tile38/NEARBY+fleet+LIMIT+5+POINTS+POINT+55.7558+37.6173+2000
  4. Route and priceGET /osrm/route/v1/driving/37.6173,55.7558;37.5537,55.7158
  5. Check surge in the cellGET /tile38/NEARBY+orders+COUNT+POINT+55.7158+37.5537+1000
  6. ETA from the nearest driversGET /osrm/table/v1/driving/37.6100,55.7500;37.6200,55.7600;37.6173,55.7558
  7. Create the orderGET /tile38/SET+orders+o0000000000000000+EX+900+POINT+55.7558+37.6173

Every one of these reports can be yours to explore

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.

Open the demo reports in your account Free sign-up. The report is waiting in your new account, with $5 of credit for your own first run.