System Design Cases
Latency vs Throughput
Latency vs Throughput — разные оси оптимизации. Demo: streaming (low latency), batching (high throughput), tail latency at fan-out, hedged requests (Tail at Scale). Объясняет percentiles (p50/p95/p99), Little's law и почему average latency обманывает.
Latency и throughput: две метрики, а не закон обмена
Latency измеряется временем на операцию, например milliseconds/request. Throughput — завершённой работой за время, например requests/second или MiB/second. Их нельзя сравнивать без workload, offered load, correctness и SLO. Оптимизация может улучшить обе метрики; batching часто повышает throughput ценой ожидания при неполном batch.
Что измерять
- latency distribution: p50, p95, p99 и долю ошибок;
- achieved throughput, а не только отправленный load;
- queue time, service time и saturation по tier;
- payload и workload mix;
- open-loop против closed-loop generator, чтобы coordinated omission не скрывал tail.
Little law L = λW связывает среднее число объектов в стационарной границе, эффективную arrival rate и среднее время внутри той же границы. Размерности обязаны сходиться. Формула не доказывает, что latency и throughput всегда движутся в разные стороны.
Сценарии
Direct path убирает искусственный linger, но сохраняет per-request protocol/IO overhead. Результат честен только вместе с нагрузкой и percentile SLO.
Size-or-time trigger ограничивает ожидание: flush при B records или D milliseconds. Apache Kafka описывает batch.size и linger.ms именно как такой trade-off; конкретный default меняется между версиями и не является архитектурным законом.
Если 100 обязательных независимых branches имеют по 1% вероятности slow event, вероятность хотя бы одного slow branch равна 1 - 0.99^100 ≈ 63.4%. Независимость — учебное допущение; shared overload обычно делает корреляцию сильнее.
Hedge посылается после threshold, а не одновременно всегда. Первый валидный ответ выигрывает, второй отменяется или deprioritized. Это подходит для idempotent/equivalent reads; duplicate write может создать второй side effect.
Практические решения
| Приём | Польза | Риск |
|---|---|---|
| batching | amortized overhead, выше records/s | deadline waiting, большие retry units |
| parallel fan-out | ниже сумма branch times | end-to-end tail следует required slow branch |
| delayed hedge | режет straggler tail | дополнительная нагрузка и consistency requirements |
| queue | absorbs bursts | queueing latency и overload collapse |
Связанные темы
[CONCEPT]capacity-planning-deep
[CONCEPT]performance-vs-scalability
Первичные источники
- Dean and Barroso, The Tail at Scale: https://research.google/pubs/the-tail-at-scale/
- Published paper PDF: https://barroso.org/publications/TheTailAtScale.pdf
- Apache Kafka producer configs: https://kafka.apache.org/10/configuration/producer-configs/
- Little, A Proof for L = λW: https://doi.org/10.1287/opre.9.3.383