Производительность
N+1: тест с множественным выбором
Шесть вопросов через весь юнит. Каждый отражает решение, которое ты принимаешь в реальном инциденте — не определение для пересказа, а фикс, который надо выбрать, когда 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-амплификацию.