알림 시스템을 왜 별도로 분리했나
다양한 서비스에서 알림을 필요로 하지만, 단일 알림 서버가 모든 로직을 처리하면 병목이나 SPOF가 되기 쉽습니다. 그래서 알림 생성과 전송을 분리해 작업 서버가 담당하게 했고, 메시지 큐를 두어 비동기/확장 가능하도록 했습니다.
메시지 큐를 사용하는 이유와 이점은 무엇인가
알림 전송은 네트워크 상태나 제3자 서비스에 따라 지연될 수 있기 때문에, 작업 서버에서 느린 처리가 전체 서비스에 영향을 주지 않도록 메시지 큐를 사용해 비동기 처리합니다. 또한 큐는 일시적인 장애 시에도 재시도 처리가 가능해 안정성을 높입니다.
알림 중복 전송은 어떻게 방지했나
메시지 큐는 최소 1회 전송을 보장하므로 중복이 가능성상 존재합니다.
이를 막기 위해 Redis에 이벤트 ID 기반의 deduplication key를 두고 TTL을 설정하거나, DB에 (user_id, event_id) 조합으로 unique 키를 설정해 중복 전송을 방지했습니다.
꼬리질문: 알림 중복을 완전히 없앴다고 생각하나 아니라면 이유는?
완전히 없앨 수는 없습니다. 네트워크 장애나 작업 서버 재시작 시 동일 메시지를 여러 번 처리할 수 있기 때문입니다. 이 때문에 우리는 "완벽한 방지"보다 현실적인 수준의 멱등성(idempotency) 처리에 집중합니다.
알림 전송 실패 시 어떻게 처리되나
작업 서버는 전송 실패 시 재시도 큐에 넣고 exponential backoff를 적용합니다.
전송 로그는 알림 로그 DB에 기록되고, 일정 횟수 이상 실패 시 dead-letter queue(DLQ)로 이동시켜 수동 점검합니다.
알림 전송량이 폭주하면 어떻게 대응하나요?
큐의 backlog 수를 모니터링하고, 작업 서버를 수평 확장하도록 설계했습니다. K8s 환경에서는 HPA(Horizontal Pod Autoscaler)를 통해 자동 확장합니다.
특정 사용자에게 하루 1000개의 알림이 보내졌어요. 이걸 어떻게 막을 수 있나요?
Redis 기반의 사용자 알림 rate-limiting을 적용했습니다. 사용자 ID를 키로 하여 sliding window 방식으로 1일 기준 알림 개수를 체크합니다.
알림 순서를 보장해야 하는 경우 어떻게 설계할 건가요?
Kafka와 같은 메시지 큐를 사용하고, 특정 사용자 ID를 기준으로 같은 partition에 할당해 순서를 보장했습니다. 소비는 해당 partition을 단일 consumer로 처리해 순서 유지를 보장합니다.
'스터디 > 시스템 설계 스터디' 카테고리의 다른 글
[면접 스터디] 개념정리: 10. 알림 시스템 설계 (0) | 2025.07.15 |
---|---|
[면접 스터디] 예상질문: 9 웹 크롤러 설계 (0) | 2025.07.10 |
[면접 스터디] 개념정리: 9. 웹 크롤러 설계 (0) | 2025.07.10 |
[면접 스터디] 예상질문: 8. URL 단축기 설계 (1) | 2025.07.09 |
[면접 스터디] 개념정리: 8. URL 단축기 설계 (0) | 2025.07.09 |