피드로 돌아가기
Owned Async Work In TypeScript. Promise.race Does Not Cancel Your Work
Dev.toDev.to
Backend

AbortSignal 기반 Ownership 모델 도입으로 Heap 메모리 330배 절감

Owned Async Work In TypeScript. Promise.race Does Not Cancel Your Work

AdmilsonCossa2026년 5월 8일8advanced

Context

Promise.race 등 기존 Native Promise API는 값의 정산(Settlement)만 처리할 뿐 실행 중인 작업의 소유권을 관리하지 못하는 한계 존재. 이로 인해 Race 패배 작업이 계속 실행되어 불필요한 I/O 비용 발생 및 Token 과금 및 리소스 누수가 발생하는 구조적 문제 직면.

Technical Solution

  • 모든 비동기 작업에 AbortSignal을 주입하여 I/O 경계에서 즉각적인 취소가 가능한 Ownership 계약 체결
  • run.race 도입을 통해 첫 번째 Settlement 발생 시 나머지 모든 작업에 CancelReason을 전달하고 AbortSignal로 강제 종료하는 구조 설계
  • LIFO(Last-In-First-Out) 방식의 ctx.defer 클린업 메커니즘을 통해 리소스 해제 완료 후 메인 Promise가 Resolve 되는 보장성 확보
  • CPU Bound 루프의 한계를 극복하기 위해 Host Boundary 수준에서 Worker를 종료하는 Worker Boundary 전략 채택
  • Token Budget을 원자적으로 관리하여 임계치 도달 시 Scope 내 모든 Worker를 즉시 중단시키는 전역 제어 레이어 구현

- 외부 API 호출 시 반드시 AbortSignal을 전달하여 Timeout 및 Race 상황에서 I/O를 즉시 중단하는지 확인 - 비동기 작업의 Cleanup 로직이 Main Process의 Resolve 이전에 완전히 실행되는지 보장하는 LIFO 구조 검토 - CPU 집약적 작업의 경우 AbortController만으로 부족하므로 Worker Thread 종료 전략 도입 고려

원문 읽기