Архитектура бэкенда
Async vs blocking: тест с множественным выбором
Шесть вопросов через весь юнит. Каждый отражает решение, которое ты принимаешь в реальном инциденте — не определение для зубрёжки, а компромисс, который надо взвесить, пока loop горит, а хвост растёт.
Убедись, что ты связываешь модель I/O, расписание event loop, что его замораживает, куда выносить CPU-работу, как ограничить fan-out и почему хвост взрывается у насыщения — синтез, к которому вели шесть уроков.
Сервис A — thread-per-connection приложение, держащее 50 000 в основном простаивающих keep-alive сокетов; сервис B делает то же на event loop. Оба почти простаивают по CPU. Почему A падает, а B чувствует себя комфортно?
Внутри I/O-колбэка ты планируешь setTimeout(a, 0), setImmediate(b) и Promise.resolve().then(c). Что выполнится первым и какой принцип это решает?
Двухстрочный эндпоинт /health начинает таймаутить, но только когда дёргают route отчётов. Этот route запускает JSON.parse на теле 40 МБ. Почему страдает health и какой сигнал диагностики правильный?
CPU-тяжёлый ресайз картинки (чистый JS) замораживает loop. Один инженер поднимает UV_THREADPOOL_SIZE с 4 до 32; другой переносит ресайз в worker thread. Кто починил и почему?
Миграция запускает await Promise.all(millionIds.map(processUser)) и её OOM-килит до того, как завершится первая тысяча, пока БД отказывает в новых соединениях. Корневая причина и фикс?
Node-сервис сидит на 75% CPU со средним 20 мс; небольшой всплеск трафика поднимает CPU до 82%, а p99 прыгает с 80 мс до 1400 мс, пока среднее почти не двигается. Как это читать?
Сквозная линия юнита — одна цепочка решений: модель I/O задаёт, как ты тратишь ожидание (парковать поток vs мультиплексировать на loop), фазы loop и дренаж microtasks задают порядок колбэков, любой синхронный участок на loop замораживает все соединения сразу, CPU-bound JS живёт в worker thread (а не в большем пуле libuv), а длинная-но-делимая работа может разбиваться на чанки, fan-out надо ограничить до того, что downstream принимает, и у насыщения очередь взрывает хвост — поэтому смотришь p99 и event-loop utilization, а не среднее, и работаешь с запасом.