Архитектура бэкенда
Async vs blocking: свободное воспроизведение
Воспроизведение бьёт перечитывание. На каждый промпт скажи или напиши полный ответ по памяти прежде, чем открыть модельный — усилие припоминания и превращает юнит из конспекта в инстинкт.
Восстанови хребет юнита, не подглядывая: две модели I/O, фазы loop и правило microtasks, что его блокирует и как это увидеть, куда выносить CPU-работу, как ограничить конкурентность и почему хвост взрывается у насыщения.
- 01Сравни блокирующий thread-per-connection с неблокирующей моделью event loop и объясни, почему event loop выигрывает на 50 000 простаивающих соединений.
- 02Опиши фазы event loop и правило дренажа microtasks и используй их, чтобы упорядочить setTimeout(0), setImmediate и разрешённый промис внутри I/O-колбэка.
- 03Почему один синхронный участок замораживает весь сервер и какой сигнал лучше всего его ловит?
- 04Какие два пула потоков стоят за loop, что выполняет каждый и сколько стоит worker thread?
- 05Объясни backpressure и ограниченную конкурентность и как выбирать лимит конкурентности k.
- 06Почему задержка взрывается у насыщения, почему смотреть на хвост, а не на среднее, и что значит «один loop — одно ядро»?
Если ты смог восстановить каждый ответ по памяти — у тебя хребет юнита: модель I/O решает, как тратить ожидание, фазы loop плюс дренаж microtasks решают порядок, единственный синхронный участок замораживает всех (ловится event-loop lag, а не CPU), пул libuv выполняет нативный I/O, а CPU-bound JS требует worker thread, который ты платишь кормить данными, backpressure и лимит конкурентности подгоняют скорость производства к скорости потребления, а у насыщения хвост взрывается нелинейно — поэтому смотри p99 и ELU и работай с запасом, ведь один loop — одно ядро.