MongoDB CQRS, Tomcat NDJSON 병목을 뚫다!

by DD
10개월 전
조회수 4

CQRS 패턴 기반의 MongoDB 시스템 도입 후 API 조회 속도 40배 향상

Tomcat에서 NDJSON 스트리밍 시 한 줄씩 블로킹되는 문제 발생

버퍼링 기법을 활용하여 엑셀 다운로드 성능 개선 달성

Tomcat NDJSON 병목 현상의 기술적 배경

Tomcat에서 Flux 타입으로 NDJSON을 처리할 때, 각 JSON 객체마다 `write`와 `flush`가 발생한다. 구체적으로, SseEmitter 내부에서 한 줄씩 직렬화하여 HttpResponse에 전송한다. 따라서, 대량 데이터 전송 시 I/O 블로킹으로 인해 성능 저하가 발생한다.

Tomcat vs Netty: 성능 비교 및 트레이드오프

Tomcat은 블로킹 I/O 방식으로 NDJSON을 처리하여 성능 병목을 발생시킨다. 반면, Nettynon-blocking 방식으로 처리하여 Tomcat 대비 7배 빠른 속도를 보인다. 하지만, Netty로 전환 시 코드 변경자원 투입이 필요하므로, 상황에 맞는 선택이 중요하다.

버퍼링 기법을 활용한 성능 개선 전략

문제 해결을 위해 Flux.buffer(1000)를 사용하여 데이터를 묶어 전송한다. 구체적으로, 1000개의 객체를 묶어 한 번에 `write` & `flush`를 수행한다. 따라서, I/O 횟수 감소를 통해 엑셀 다운로드 성능 향상을 달성하고, Tomcat 환경에서도 효율적인 스트리밍을 구현했다.

MongoDB CQRS 성능 개선기: 예상치 못한 Tomcat NDJSON 병목 해결