피드로 돌아가기
Dev.toBackend
원문 읽기
.NET 8 기반 비동기 Fan-out 구조의 멀티 채널 알림 서비스 설계
Building a Multi-Channel Notification Service in .NET 8
AI 요약
Context
API 컨트롤러 내 외부 Provider 직접 호출로 인한 응답 시간 증가 및 외부 장애 전파 문제 발생. 특정 채널의 Rate Limit 도달 시 메시지 유실 및 신규 채널 추가 시 발생하는 코드 수정 범위 확대로 인한 유지보수 효율 저하 해결 필요.
Technical Solution
- RabbitMQ Topic Exchange를 통한 Producer-Consumer 분리로 API 응답 시간 상수를 유지하는 비동기 구조 설계
- Dispatcher 내 Task.WhenAll 기반 Parallel Fan-out 적용으로 개별 채널 지연이 타 채널에 영향 주지 않는 격리 환경 구축
- Scriban Template Engine 채택을 통한 샌드박스 AST 기반의 보안성 확보 및 Razor 대비 빠른 문자열 보간 성능 구현
- Sliding Window 방식의 Rate Limiter를 API 계층이 아닌 Dispatcher에 배치하여 모든 유입 경로에 일관된 제한 적용
- IEnumerable 인터페이스 기반 DI 설계를 통해 기존 코드 수정 없이 신규 채널을 추가하는 Open-Closed Principle 구현
- Dead-letter Queue와 3회 재시도 메커니즘을 통한 외부 Provider 장애 시 메시지 유실 방지 체계 구축
실천 포인트
1. 외부 API 의존성이 높은 서비스는 반드시 메시지 큐를 통한 비동기 처리로 장애 전파 차단
2. 다중 목적지로 데이터를 전송할 경우 Task.WhenAll을 활용한 Fan-out 패턴으로 전체 지연 시간 최적화
3. 템플릿 엔진 선택 시 단순 성능 외에 샌드박스 실행 가능 여부를 통한 보안 위험 검토
4. 공통 제약 사항(Rate Limit 등)은 유입 지점이 아닌 실행 직전의 오케스트레이션 계층에 배치