awesome-everything EN
↑ Обратно к восхождению

Производительность

N+1: тест с множественным выбором

Суть Синтез всего юнита N+1 в формате выбора — стоимость round-trip, выбор семейства фикса по cardinality, DataLoader, off-CPU детекция, исчерпание пула и DoS-амплификация.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 13 min

Шесть вопросов через весь юнит. Каждый отражает решение, которое ты принимаешь в реальном инциденте — не определение для пересказа, а фикс, который надо выбрать, когда query log перед тобой, а страница тормозит.

Цель

Подтвердить, что ты связываешь модель стоимости round-trip, четыре семейства фиксов, инструменты детекции и вторичные сбои — синтез, к которому вели отдельные уроки.

Викторина

Страница-список делает 51 запрос по 0.4 мс каждый, но wall-clock — 765 мс. DBA настаивает, что каждый запрос быстрый и индексы в порядке. Как это примирить?

Викторина

Страница грузит 50 заказов, у каждого ~20 line item'ов. Ты фиксишь N+1 через JOIN, количество запросов падает 51 → 2, но p99 ухудшается на 30%. Что произошло и какой фикс?

Викторина

GraphQL-запрос me { posts { author { name } } } на 50 постов делает 1 + 50 author-lookup'ов. Почему ORM eager loading (.includes / select_related) это не фиксит, и что фиксит?

Викторина

REST-агрегатор вызывает 8 downstream-сервисов последовательно по 30 мс каждый (240 мс p99). SQL N+1 на странице-списке тоже стоит ~240 мс. Это одна проблема, и у них общий фикс?

Викторина

Сервис с пулом на 25 соединений начинает отдавать 503 под нагрузкой. Latency отдельных запросов стабильна, БД здорова, но насыщение пула приклеено к ~100%, а очередь запросов растёт. Корневая причина и первый фикс?

Викторина

Публичный GraphQL-эндпоинт даёт клиентам управлять глубиной вложенности и размером страницы. Один сконструированный запрос разгоняет БД до тысяч запросов. Как сениор должен это сформулировать, и какой устойчивый guard?

Итог

Сквозная линия юнита — одно дерево решений: сначала считай round-trip’ы (цена в количестве trip’ов, а не в скорости запроса), затем выбирай фикс по cardinality — JOIN для one-to-one, IN/selectinload для тяжёлого one-to-many, preload когда форма известна на месте запроса, DataLoader когда lookup’ы разбросаны по резолверам, и параллельный dispatch когда независимые сервисы не делят backend. Детектируй off-CPU через query log и APM-waterfall, гейти в CI и помни вторичные сбои: раздувание payload от JOIN, исчерпание пула соединений, переключения query plan и DoS-амплификацию.

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

Trademarks belong to their respective owners. Editorial reference only.