Node.js비동기와 런타임

worker threads, pool, MessageChannel

`worker_threads`를 실전에 붙일 때의 pool 전략, `MessageChannel`, transfer, shared memory 기준을 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

javascript
import { MessageChannel, Worker } from "node:worker_threads";

설명

  • worker_threads의 기본 카드는 "CPU 바운드 작업을 분리한다"는 출발점에 가깝고, 실전에서는 그 다음 단계가 더 중요합니다. 바로 "워커를 어떻게 재사용하고 메시지를 어떻게 주고받을 것인가"입니다.
  • 요청마다 워커를 새로 만들면 생성 비용이 누적되므로, 반복 작업이 많은 경우에는 pool 전략이 훨씬 자연스럽습니다. 즉 worker는 보통 일회용보다 재사용 가능한 실행 슬롯으로 다룹니다.
  • MessageChannel은 워커와 메인 스레드, 또는 워커끼리 더 구조화된 통신 채널을 만들 때 유용합니다. 단순 postMessage()보다 메시지 경계를 더 또렷하게 설계할 수 있습니다.
  • transfer list와 SharedArrayBuffer는 복사 비용을 줄이거나 메모리를 공유하게 해 주지만, 동시에 동기화와 데이터 무결성 문제를 끌고 옵니다. 즉 성능 도구이면서 설계 도구이기도 합니다.
  • 그래서 worker 실전 설계의 핵심은 "분리할 것인가"보다 "어떤 단위로 work item을 보내고, 어떤 방식으로 결과를 수집하며, 얼마나 오래 살아 있게 할 것인가"입니다.

빠른 정리

개념역할
worker pool워커 생성 비용을 줄이고 재사용
MessageChannel구조화된 메시지 전달 경로
transfer list버퍼를 복사 대신 이동
SharedArrayBuffer메모리 공유
핵심 판단작업 단위, 통신 방식, 수명주기 설계

주의할 점

worker를 늘리는 것만으로 성능이 자동으로 좋아지지는 않습니다. 메시지 직렬화 비용, 생성 비용, 공유 메모리 복잡도까지 함께 고려해야 실제 이득이 납니다.

참고 링크

1 sources