불확실한 메시지 전송에서 신뢰성 있는 RabbitMQ Ack로 [2부]
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
RabbitMQ 및 Spring Framework를 활용한 메시지 시스템 개발자
- 중급~고급 수준 (publisher confirmations, 채널 관리, 비동기 처리 기술 필요)
핵심 요약
waitForConfirmsOrDie()
사용: 메시지 전송 후 즉시 확인을 강제하여 신뢰성 확보- 비동기
correlated
ACK :CorrelationData
로 메시지 추적, 채널 생성/폐기 오버헤드 최소화 - 채널 수 제한 설정 :
checkout-timeout
을 통해 OOM 예방 및 리소스 제어 confirm-type: correlated
사용:confirmCallback
과 호환되며 성능 향상
섹션별 세부 요약
1. Publisher Confirmations 기초
- Delivery Tag : 채널 범위 내 유일한 메시지 식별자 제공
- ACK/NACK 콜백 : 성공/실패 시 별도 처리 가능
waitForConfirms()
: 채널 캐시 반환 전 확인 처리 필수- 예시 코드:
```kotlin
channel.waitForConfirmsOrDie(10_000)
```
2. 비동기 Correlated ACK 구현
- 비동기 처리 :
invoke()
로 채널 재사용,CorrelationData
로 메시지 추적 - 재시도 가능 : 실패 메시지만 별도 처리 가능
- Spring 설정 예시:
```yaml
spring:
rabbitmq:
publisher-confirm-type: correlated
```
3. 채널 생성 과잉 문제 (Channel Churn)
- 문제점 :
convertAndSend()
호출 시 채널 생성/폐기 반복 → OOM 위험 - 해결 방안 :
```kotlin
template.invoke { channel ->
messages.forEach { channel.convertAndSend(...) }
}
```
- Spring 캐시 설정 :
```yaml
spring:
rabbitmq:
cache:
channel:
size: 3
checkout-timeout: 5000
```
4. `simple` vs `correlated` confirm-type 선택
simple
: 채널 즉시 반환 → 성능 저하 가능성correlated
:confirmCallback
사용 권장- 주의 사항 :
simple
설정 시waitForConfirm()
호출 필수
5. 채널 수 제한의 영향
- 무제한 채널 : 메모리 사용량 증가, 고부하 시 OOM 위험
- 제한 채널 : 리소스 예측성 향상, 동시 전송 스레드 많을 때 유리
- 적용 시나리오:
- 제한 채널 : 고부하 시스템, 메모리 제어 필요 시
- 무제한 채널 : 개발/테스트 환경, 스레드 블록 불가능 시
결론
- 비동기
correlated
ACK 사용으로 비동기 처리 효율성 극대화 checkout-timeout
설정을 통해 채널 생성 과잉 방지- Spring 설정에서
confirm-type: correlated
사용 권장 - 메시지 시스템 성능 향상을 위해 RabbitMQ 통계 모니터링 필수