पाठ 12 / 25

Tail Latency and Fan-Out

Measure percentiles and reduce tail latency in fan-out architectures.

The slowest requests matter most

Averages hide pain. Report latency as percentiles: p50 (median), p95, p99 and p99.9. At scale, tail latency dominates user experience because one page often calls many services: if a request fans out to 100 backends and each has a 1% chance of being slow, about 63% of requests (1 − 0.99^100) hit at least one slow backend. Tail latency comes from garbage-collection pauses, noisy neighbours, cold caches, retries and queueing. Techniques to reduce it: keep fan-out small; set tight timeouts with partial results (show the page without recommendations); use hedged requests, sending a second copy to another replica if the first has not answered by the p95 time, and using whichever replies first; reduce variability through capacity headroom and fewer synchronous dependencies. Measure percentiles from histograms; averaging percentiles across servers gives wrong numbers.

Fan-out amplifies the tail

Probability that a page waits on at least one slow call.

for fan_out in (1, 10, 50, 100):
    p_slow_page = 1 - 0.99 ** fan_out      # each call slow with probability 1%
    print(fan_out, f"{p_slow_page:.0%}")

# hedged request: after the p95 deadline, ask a second replica
async def hedged_get(key, replicas, hedge_after=0.05):
    first = asyncio.create_task(replicas[0].get(key))
    done, _ = await asyncio.wait({first}, timeout=hedge_after)
    if done:
        return first.result()
    second = asyncio.create_task(replicas[1].get(key))
    done, pending = await asyncio.wait({first, second}, return_when=asyncio.FIRST_COMPLETED)
    for t in pending:
        t.cancel()
    return done.pop().result()

Hedge only idempotent reads

A hedged request sends duplicate work. Use it for safe reads, cap the extra load (for example only after the p95 deadline), and never for operations like payments.

त्वरित जाँच: Why should latency SLOs use percentiles such as p99 rather than averages?

  • Averages hide the slow requests that many users experience, especially with fan-out
  • Averages are harder to compute
  • p99 is always lower than the average
  • Percentiles ignore errors
Answer

Averages hide the slow requests that many users experience, especially with fan-out — A good average can coexist with a painful tail that users regularly hit.