intermediate

CPU-bound vs I/O-bound work

Классифицируйте bottlenecks, чтобы async I/O, worker threads, queues, caching, batching или horizontal scaling решали правильную проблему.

Node силён в конкурентном I/O-bound — много ожиданий сети/диска на одном потоке. CPU-bound JS (парсинг огромного JSON, resize в JS, тяжёлая агрегация) блокирует event loop и бьёт по всем клиентам.

| Узкое место | Симптомы | Меры | |------------|----------|-------------| | I/O-bound | Ожидание БД/API/диска | Async API, пулы, кэш, батчинг | | CPU-bound (JS) | Скачки delay event loop | Worker threads, native, отдельный сервис | | CPU-bound (libuv sync) | Очередь thread pool | Меньше параллелизма, native, осторожно больший пул |

Сначала измерьте: утилизация event loop, delay через `perf_hooks`, p99 под нагрузкой.

					// Плохо: блокирует все запросы на 200ms
const sorted = hugeArray.sort(expensiveCompare);

// Лучше: worker или чанки с yield через setImmediate
				

На интервью: классифицируйте нагрузку; почему больше workers в cluster — throughput, но не CPU одного запроса на worker.

Типовые ошибки: `JSON.parse` мегабайт на main thread; катастрофический backtracking regex; реплики без устранения блокировок loop.

Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.

Чеклист:

  • Профиль: CPU vs I/O.
  • Тяжёлое вычисление с main thread.
  • Кэш для read-heavy I/O.
  • Лимиты размера payload на edge.