Hacker News Digest

24 августа 2025 г. в 05:10 • gojiberries.io • ⭐ 106 • 💬 26

OriginalHN

#scalability#system-design#performance-optimization#queueing-theory#rate-limiting#jitter#facebook#go

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 (неравенство Йенсена).
Равномерный джиттер оптимален и справедлив.

Практика

  1. Детерминированные границы:

    • M/W ≤ H ⇒ W ≥ M/H;
    • (M/W)·s ≤ K ⇒ W ≥ Ms/K (s — p95 времени обработки, K — свободная конкурентность).
  2. Вероятностные границы:
    Пусть N ~ Poisson(M/W). Требуем Pr{N > H} ≤ ε.
    Для H ≳ 50 нормальное приближение даёт
    λε ≈ ((-z₁₋ε + √(z₁₋ε² + 4(H+0.5)))/2)²,
    W ≥ M/λε.
    Для малых H или ε считать точный хвост Пуассона.

  3. Подсказки от сервера:

    • Retry-After: Δ → джиттер в [Δ, Δ+W];
    • rate-limit: R оставшихся запросов до сброса через Δ → λadm = min(H, R/Δ) → W ≥ M/λadm.
  4. Продуктовые ограничения:

    • дедлайн D ⇒ W ≤ D;
    • p95 добавленной задержки ≤ L ⇒ W ≤ L/0.95.

Минимально-ожидающая политика
Выбрать наименьший W, удовлетворяющий всем нижним границам и не превосходящий верхние.
Если невозможно — добавить мощность или ослабить ограничения.