open atlas
↑ К треку
Основы System Design SD · 02 · 06

Доступность: чтение чисел и конфигов

Читай реальную математику доступности, конфиг и код, затем делай арифметику: расчёт бюджета ошибок, сложение последовательной доступности, проверку размера резервирования и retry-конфиг, что превращает медленную зависимость в сбой.

SD Senior ◷ 14 min
Уровень
ОсновыJuniorMiddleSenior

Инциденты доступности живут в числах, не в прозе: бюджет SLO, цепочка зависимостей, перемноженная вместе, пул, размеренный до N вместо N+1, retry-политика без backoff. Читай каждый сниппет, делай арифметику в голове и выбирай ответ, под которым подписался бы senior-дежурный.

Практикуй петлю, что гоняешь во время ревью доступности или инцидента: локализуй числа, примени математику девяток/бюджета ошибок/сложения или правила ретраев-и-таймаутов и выбери изменение, что арифметика реально поддерживает, — а не то, что звучит успокаивающе.

Сниппет 1 — хелпер бюджета ошибок

def error_budget_minutes(slo: float, window_days: int = 28) -> float:
    # допустимый простой = (1 - SLO) * окно
    return (1 - slo) * window_days * 24 * 60

print(round(error_budget_minutes(0.999), 1))   # что напечатает?
Викторина

Что вернёт error_budget_minutes(0.999) за окно в 28 дней и что это значит?

Сниппет 2 — цепочка зависимостей

# запрос должен пройти все четыре, чтобы успеть
chain = {"lb": 0.999, "app": 0.999, "cache": 0.999, "db": 0.999}

avail = 1.0
for a in chain.values():
    avail *= a
print(round(avail, 4))   # что напечатает и это >= SLO 99,9%?
Викторина

Что это напечатает и держит ли путь SLO 99,9%?

Сниппет 3 — конфиг резервирования

# конфиг автоскейлера / ёмкости
peak_required_instances: 6     # инстансов нужно нести пик
desired_instances: 6           # сколько реально гоняем
# заметка: "мы гоняем несколько инстансов, значит слой зарезервирован"
Викторина

Команда зовёт слой зарезервированным, ведь гоняет несколько инстансов. По уроку резервирования, что не так и какова починка?

Сниппет 4 — retry-политика

# клиент, зовущий нижестоящий сервис
RETRY_CONFIG = {
    "max_attempts": 5,
    "timeout_seconds": 30,     # на попытку
    "backoff": "none",         # ретрай немедленно
    "jitter": False,
}
# нижестоящий сервис только что начал отдавать медленные ответы
Викторина

Нижестоящий сервис замедляется. Что эта retry-политика с ним делает и какова верная конфигурация?

Вспомните перед уходом
  1. 01
    Как посчитать бюджет ошибок из SLO и какова частая ошибка на одну девятку?
  2. 02
    Почему путь из четырёх звеньев по 99,9% промахивается мимо SLO 99,9% и каковы починки?
  3. 03
    Что превращает медленный нижестоящий в сбой в retry-конфиге и какова безопасная конфигурация?
Итог

Каждое решение доступности в этом разделе сводится к арифметике, что читается прямо с конфига. Бюджет ошибок — это (1 − SLO) × окно — 99,9% за 28 дней ≈ 40 минут — и классический баг — промах на одну девятку (0,01 против 0,001, ошибка в 10×). Доступность пути — это произведение его последовательных звеньев, так что цепочка из четырёх звеньев по 99,9% — лишь ~99,6% и промахивается мимо SLO 99,9%; чинишь убиранием хопов или добавлением резервирования, а не правкой прозы. Резервирование — это N+1, так что desired_instances == peak_required — это N — не зарезервировано — и потеря одного в пик кренит в коллапс очередей; ты провижинишь запасной. А retry-политика с длинными таймаутами и немедленными, без jitter ретраями превращает медленную зависимость в retry storm и сбой — починка это короткие ограниченные таймауты, бюджет ретраев, экспоненциальный backoff с jitter, circuit breakers и ретраи лишь идемпотентного. Senior-привычка та же, что в разделе масштабируемости: найди числа, сделай математику и выбери починку, что поддерживает арифметика, а не ту, что звучит безопасно.

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.