How to make things slower so they go faster
Как замедлить, чтобы ускорить
Синхронный спрос — когда множество клиентов действуют одновременно.
Пропускная способность μ, фоновая нагрузка λ₀, запас H = μ − λ₀.
M клиентов, синхронизированных по крону, кэшу или перезапуску, превышают H, образуют очереди, таймауты, ретраи и инцидент.
Цель — размазать пик или безопасно его слить, сохраняя справедливость и лимиты.
Источники выравнивания:
- естественные — часы, TTL, SDK-таймеры;
- индуцированные — деплой, рестарт, сброс кэша, обновление токенов;
- внешние — DDoS, флеш-крауд.
Ограничения:
- мягкие — задержка в очереди;
- жёсткие — пулы соединений, дескрипторы, потоки.
Превышение даёт обрыв: ещё одно соединение → таймаут → ретраи → ещё больше нагрузки.
Важно, кто ждёт: онлайн-запросы требуют справедливости, офлайн — только пропускной способности.
Математика размагничивания
M действий равномерно в окне [0, W]:
ожидаемый пик M/W, средняя задержка W/2, произведение M/2 — константа.
Чем шире W, тем ниже пик, но выше средняя задержка.
Для выпуклой функции стоимости C(r) равномерное r(t)=M/W минимизирует ∫C(r)dt (неравенство Йенсена).
Равномерный джиттер оптимален и справедлив.
Практика
-
Детерминированные границы:
- M/W ≤ H ⇒ W ≥ M/H;
- (M/W)·s ≤ K ⇒ W ≥ Ms/K (s — p95 времени обработки, K — свободная конкурентность).
-
Вероятностные границы:
Пусть N ~ Poisson(M/W). Требуем Pr{N > H} ≤ ε.
Для H ≳ 50 нормальное приближение даёт
λε ≈ ((-z₁₋ε + √(z₁₋ε² + 4(H+0.5)))/2)²,
W ≥ M/λε.
Для малых H или ε считать точный хвост Пуассона. -
Подсказки от сервера:
- Retry-After: Δ → джиттер в [Δ, Δ+W];
- rate-limit: R оставшихся запросов до сброса через Δ → λadm = min(H, R/Δ) → W ≥ M/λadm.
-
Продуктовые ограничения:
- дедлайн D ⇒ W ≤ D;
- p95 добавленной задержки ≤ L ⇒ W ≤ L/0.95.
Минимально-ожидающая политика
Выбрать наименьший W, удовлетворяющий всем нижним границам и не превосходящий верхние.
Если невозможно — добавить мощность или ослабить ограничения.