피드로 돌아가기
Dev.toBackend
원문 읽기
64KB 고정 메모리로 10k+ 동시 연결을 처리하는 Node.js Streams 설계
Node.js Streams: The Practical Guide
AI 요약
Context
대용량 파일 처리 시 전체 데이터를 메모리에 로드하는 Buffering 방식의 한계 분석. 파일 크기에 비례하여 메모리 사용량이 증가함으로써 발생하는 시스템 리소스 고갈 및 OOM(Out of Memory) 위험 식별.
Technical Solution
- Chunk 단위 데이터 처리를 통한 메모리 점유율의 상수 시간 복잡도 유지
- Readable, Writable, Duplex, Transform의 4가지 Stream 타입을 활용한 데이터 흐름 제어
- pipe 및 pipeline API를 통한 Stream 간의 결합 및 Back-pressure 자동 제어 설계
- Transform Stream 내 objectMode 설정을 통한 Buffer 기반 데이터를 고수준 JS 객체로 변환하는 파이프라인 구축
- Transfer-Encoding: chunked 헤더를 적용하여 API 응답 시 DB 커서 데이터를 실시간 전송하는 구조 설계
Impact
- 메모리 사용량: 파일 전체 로드 시 100MB+에서 Chunk 단위 처리 시 약 64KB로 절감
- 동시성: 효율적인 리소스 관리로 10k+ Concurrent Connections 처리 가능
실천 포인트
1. 대용량 파일/API 응답 처리 시 fs.readFileSync 대신 createReadStream 사용 여부 검토
2. 단순 .pipe() 대신 에러 핸들링이 강화된 pipeline() API 적용
3. 메모리 효율 극대화를 위해 highWaterMark 설정을 통한 Chunk 사이즈 최적화
4. 데이터 변환 단계가 필요한 경우 Custom Transform Stream 클래스 구현