페이지 불러오는 중
대용량 메시징 시스템에서 영속성(Persistence)을 위해 파일 기반 저장 방식을 채택할 때, 예상치 못한 디스크 사용량 급증을 겪을 수 있습니다.
대용량 콘텐츠(최대 10MB)를 포함한 이메일 발송 시, 수신 서버와의 레이턴시 차이로 디스크 공간이 빠르게 부족해지고 결국 브로커가 셧다운되는 현상이 발생했습니다. ActiveMQ의 KahaDB 블록 관리 메커니즘을 진단하고, Throttling(백프레셔) + Timeout 최적화로 물리 증설 없이 해결한 과정입니다.
[블로그 전용 시각화: KahaDBBlockDiagram]
즉, 미소비 메시지가 줄지 않으니 16MB 블록이 회수되지 않고, 디스크가 storeUsage 한계에 도달하면 브로커가 Producer를 블로킹하거나 셧다운됩니다.
시스템 자체 다운을 막기 위해 Pusher(Producer) 측에 임계치 제어를 추가했습니다.
[Pusher 루프]
while (hasWork):
pending = adminApi.getQueueSize("mail.send")
if pending > 20_000:
sleep(backoffMillis) # 유입 억제 → Dequeue가 블록을 비울 시간 확보
continue
push(nextBatch)ActiveMQ 자체의
PendingMessageLimitStrategy,producerFlowControl,systemUsage/storeUsage설정과 병행하면 브로커·애플리케이션 양쪽에서 역압이 걸립니다. 애플리케이션 임계치는 "브로커가 막기 전에 미리 늦추는" 1차 방어선입니다.
수신 서버와의 불필요한 대기를 줄이기 위해 단계별 타임아웃을 재설정했습니다.
효과: 비정상 세션을 빠르게 정리 → Dequeue 처리 효율 상승 → 16MB 블록이 제때 비워져 journal GC가 정상 동작.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.