피드로 돌아가기
A New Streaming API for Node v0.10
Node.js BlogNode.js Blog
Backend

Node.js가 Stream API를 완전히 재설계해 pause() 동작 보장 및 read() 메서드 도입으로 백프레셔 제어 가능

A New Streaming API for Node v0.10

2012년 12월 21일10intermediate

Context

Node v0.8 이전의 Stream API는 pause() 메서드가 권고사항일 뿐 실제로 데이터 이미션을 멈추지 못했으며, 'data' 이벤트가 즉시 발생해 데이터 수신 준비 전에 버퍼링이 필요했다. 스트림 구현 시 pause, resume, write-buffering, data 이벤트 간의 복잡한 상호작용을 올바르게 처리하기 어려웠으며, 특정 바이트 수만큼 읽고 나머지를 다른 부분에 전달할 방법이 없었다.

Technical Solution

  • pause() 메서드를 권고사항에서 강제 동작으로 변경: 호출 시 실제로 데이터 이미션을 중단하도록 구현
  • read() 메서드 도입: 버퍼 또는 null을 반환하며 능동적 읽기 제어 가능
  • 스트림 초기 상태를 일시정지(paused state)로 설정: 'data' 이벤트 핸들러 추가 또는 resume() 호출까지 데이터 흐름 억제
  • 'data' 이벤트, pause(), resume() 하위 호환성 유지: 기존 코드 대부분이 수정 없이 작동
  • Transform 및 Duplex 스트림 베이스 클래스 제공: 커스텀 스트림 구현 시 일관된 인터페이스 제공

Key Takeaway

Stream API 재설계 시 하위 호환성 유지와 행동 보장의 균형을 맞추려면, 기존 이벤트 기반 인터페이스를 보존하되 초기 상태 변경과 메서드 의미론 명확화를 통해 예상 불일치를 해결해야 한다.


Node.js 애플리케이션에서 대용량 데이터 처리 시 streams2 API의 read() 메서드를 통해 능동적으로 읽기 제어하면, 메모리 버퍼링 크기를 예측 가능하게 관리할 수 있고 백프레셔 처리를 프레임워크 수준에서 자동화할 수 있다.

원문 읽기