피드로 돌아가기
Dev.toBackend
원문 읽기
Async Generator 도입으로 50만 건 처리 시 메모리 사용량 90% 절감
Reading a Paginated API Without Holding the Whole Thing in Memory
AI 요약
Context
Paginated API의 모든 데이터를 수집하기 위해 전체 데이터를 메모리에 적재한 후 처리하는 Eager Loading 방식 채택. 데이터셋 규모 증가에 따른 Memory Heap 급증과 네트워크 요청 완료 전까지 처리가 불가능한 블로킹 구조의 한계 발생.
Technical Solution
- Async Generator를 활용한 Pull-based Lazy Loading 구조 설계
async function*와yield키워드를 통해 네트워크 요청과 레코드 반환의 제어권을 소비자로 이전for await...of루프를 통한 스트리밍 처리로 데이터 수신과 동시에 즉시 프로세싱 수행- 커서 기반의 페이지 요청 로직을 Generator 내부로 캡슐화하여 클라이언트 코드의 복잡도 제거
- 조건 충족 시
break를 통한 조기 종료로 불필요한 API 호출을 차단하는 최적화 구현
실천 포인트
- 대량 데이터 API 호출 시 `all.push(...records)` 패턴의 메모리 점유율 검토 - 데이터 처리 중 조기 종료(Early Exit) 가능성이 있는 경우 Lazy Loading 적용 고려 - 높은 Throughput이 최우선인 경우 Async Generator의 순차적 처리 한계를 인지하고 `Promise.all` 기반의 병렬 처리와 비교 분석