Warehouse-Scale & Datacenter Computing

request-level parallelism

Picture a busy coffee shop with twelve baristas. A hundred customers walk in, each wanting their own drink. The customers do not need to cooperate — Alice's latte has nothing to do with Bob's espresso — so the shop just hands each order to whichever barista is free, and a dozen drinks get made at once. The speedup is almost free precisely because the orders are independent. That is the shape of request-level parallelism: lots of separate, unrelated jobs that can run side by side simply because none of them waits on another.

In a warehouse-scale computer the 'orders' are user requests: web searches, page loads, photo uploads, API calls. Millions of them arrive per second, and crucially each one is independent of the others — your search has nothing to do with mine. So the system spreads them across the whole fleet of servers, each machine (or thread) handling a different request, and total throughput scales almost linearly: twice the servers serve roughly twice the requests. This is the easiest kind of parallelism to exploit because there are no shared updates to coordinate and no fine-grained communication to synchronize — you just need enough machines and a way to route each request to one.

It helps to contrast it with the harder kinds of parallelism that the rest of computer architecture struggles with. Instruction-level parallelism overlaps operations inside one instruction stream and is limited by dependencies; data-level parallelism does the same operation across many data elements; thread-level parallelism splits one program across cores and must coordinate shared memory. Request-level parallelism sidesteps almost all of that hard coordination because the units of work are whole, independent requests. This abundance of cheap, independent parallelism is the single most important reason a WSC can be built from many ordinary computers instead of one heroic machine.

The honest caveat: requests are not always perfectly independent. They often hit the same shared database, the same hot data, or the same lock, and that shared state is where contention, consistency problems, and tail latency creep back in. Request-level parallelism makes scaling out easy, but the shared services underneath still have to be engineered carefully, or the independence is an illusion that breaks under load.

An online store on a sale day gets 50,000 page views per second, each one a separate request. A load balancer sprays them across 2,000 web servers, about 25 requests per server per second. Add 2,000 more servers and you can serve roughly twice the traffic — because the requests never needed to talk to each other.

Independent requests scale out almost linearly: more servers, proportionally more throughput.

Request-level parallelism is the easiest parallelism to exploit only when requests are truly independent. The moment they all hammer one shared database or lock, contention and tail latency return.

Also called
RLP請求平行性