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

Трафик и периметр: чтение конфига и кода

Читай реальный конфиг балансировщика, шлюза и CDN, затем принимай решение: лгущий health-check, несовпадение алгоритма, шлюз в один инстанс и заголовок кэша, который течёт или устаревает.

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

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

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

Сниппет 1 — health-check

upstream api {
  server 10.0.1.10:8080;
  server 10.0.1.11:8080;
}
# проверка доступности
location /healthz { return 200 "ok"; }   # статичный 200, ничего не трогает
# у узла 10.0.1.11 исчерпан пул БД; каждый реальный запрос отдаёт 500
Викторина

Узел .11 проходит /healthz и остаётся в ротации, отдавая пользователям 500-е. Почему и каков фикс?

Сниппет 2 — выбор алгоритма

# кэш-уровень: каждый узел держит горячее подмножество ключей в памяти
upstream cache_tier {
  least_conn;                 # балансировать по наименьшему числу активных соединений
  server cache-1; server cache-2; server cache-3; # ... 12 узлов
}
# наблюдается: hit ratio ужасен (~10%); почти каждый запрос промахивается
Викторина

Кэш-уровень использует least_conn, а hit ratio ~10%. Что не так и какой алгоритм нужен?

Сниппет 3 — деплой шлюза

# kubernetes deployment для API-шлюза (перед 15 сервисами)
kind: Deployment
metadata: { name: api-gateway }
spec:
  replicas: 1                 # один инстанс
  strategy: { type: Recreate } # убить старый под, затем стартовать новый
# все 15 сервисов достижимы только через этот шлюз
Викторина

В чём риск этого деплоя шлюза и каков минимальный фикс?

Сниппет 4 — заголовок кэша

# ответ для GET /account/orders  (показывает заказы залогиненного пользователя)
HTTP/1.1 200 OK
Cache-Control: public, max-age=600
# отдаётся через разделяемый CDN; заголовка Vary нет
Викторина

Этот аутентифицированный ответ на пользователя несёт Cache-Control: public на разделяемом CDN. Каково последствие и фикс?

Вспомните перед уходом
  1. 01
    Почему статичный-200 health-check лжёт и что делает чек осмысленным?
  2. 02
    Когда least-connections/round-robin дают ужасный hit ratio кэша и каков фикс?
  3. 03
    Почему ответ на пользователя с Cache-Control: public на разделяемом CDN опасен и как починить?
Итог

Каждое решение по трафику в этом юните сводится к настройке, которую можно прочесть прямо из конфига. Health-check, возвращающий статичный 200 (или просто открывающий сокет), лжёт — он никогда не трогает цепочку зависимостей, поэтому узел, отдающий 500-е, остаётся в ротации; сделай его пробящим реальную БД/кэш и добавь пассивное выкидывание. Алгоритм должен совпадать с целью: least-connections/round-robin балансируют по числу и разрушают hit ratio кэш-уровня, где консистентное хеширование по ключу хранит локальность. Шлюз при replicas: 1 — учебная единая точка отказа с простоем на каждом деплое — гоняй несколько реплик за балансировщиком с rolling update. А ответ на пользователя с Cache-Control: public на разделяемом CDN — это утечка данных, ждущая случиться — используй private/no-store и Vary. Старший навык — найти настройку, рассудить, как она ведёт себя под нагрузкой и отказом, и выбрать фикс, который поведение поддерживает — а не тот, что его прячет.

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

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

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

Trademarks belong to their respective owners. Editorial reference only.