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

Архитектура бэкенда

Async vs blocking: тест с множественным выбором

Суть Синтез с множественным выбором по всему юниту async/blocking — модели I/O, расписание event loop, что его блокирует, вынос CPU-работы, ограниченная конкурентность и хвостовая задержка под нагрузкой.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 13 min

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

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

Trademarks belong to their respective owners. Editorial reference only.