NestJS · Scaling

로드 밸런싱과 수평 확장의 상태 조건

NestJS를 여러 인스턴스로 늘릴 때 핵심은 요청을 나눠 받는 것보다, 인스턴스 메모리에 묶인 상태와 DB 연결, 세션, 실시간 연결을 확장 가능한 위치로 옮기는 것이다.

01

상태 점검

로그인 세션, 캐시, 파일 업로드, websocket room이 메모리에만 있는지 확인한다.

02

헬스체크

로드 밸런서는 살아 있음과 준비됨을 구분해 트래픽을 보낸다.

03

인스턴스 증가

CPU와 latency 지표를 기준으로 replica 수를 늘리고 DB pool 한도를 조정한다.

04

일관성 보정

세션 저장소, distributed cache, pub/sub으로 인스턴스 간 상태를 맞춘다.

Round robin
기본 분산 요청을 인스턴스에 순차 또는 가중치로 배분
상태 없는 API에 적합
Sticky
세션 고정 WebSocket이나 메모리 세션 때문에 같은 인스턴스로 보냄
확장성과 장애 복구 약화
Redis
공유 상태 세션, 캐시, socket adapter를 인스턴스 밖에 둠
Redis 장애 대응 필요
Pool
DB 연결 통제 replica 증가가 DB 연결 폭증으로 이어지지 않게 조정
pooler 검토

로컬 상태 · 헬스 · 연결 수 점검

로컬 상태 업로드 파일과 세션이 컨테이너 내부에만 남지 않는다.
헬스 DB 연결 불가 인스턴스가 트래픽을 받지 않는다.
연결 수 최대 replica에서 DB와 Redis 연결 한도를 넘지 않는다.
실시간 여러 인스턴스 사이 WebSocket room broadcast가 유지된다.