티스토리 뷰
알림 시스템은 단순히 모바일 푸시 알림에 한정되지 않음.
- 책에서는 모바일 푸시 알림, SMS 메시지, 이메일 3가지로 분류함.
1단계, 문제 이해 및 설계 범위 확정
질문을 통한 설계 범위 확정
Q) 어떤 종류의 알림 ?
- 푸시 알림, SMS 메시지, 이메일
- iOS, Android, Laptop/Desktop 지원해야 함
Q) 실시간 시스템인지?
- 연성 실시간 시스템 (Soft real-time)
- 가능한 빨리 전달되어야 하지만, 요청이 몰린 경우 약간의 딜레이 허용
Q) 사용자가 알림을 받지 않는 옵션이 존재하는지?
- 사용자가 알림을 허용하지 않으면 알림을 받지 않음
Q) 하루에 몇 건의 알림?
- 천만 건의 모바일 푸시
- 백만 건의 SMS 메시지
- 5백만 건의 이메일
2단계, 개략적 설계안 제시 및 동의 구하기
알림 유형별 지원 방안
iOS 푸시 알림
- 알림 제공자 → APNS → iOS 단말기
- 알림 제공자
- 알림 요청을 만들어 APNS로 보내는 주체
- 단말토큰, 페이로드 데이터 필요
- APNS: 애플이 제공하는 원격 서비스, 푸시 알림을 iOS 단말로 보냄
안드로이드
- 알림 제공자 → FCM (Firebase Cloud Messaging) → 안드로이드 단말
SMS 메시지
- 알림 제공자 → SMS 서비스 (네이버, NHN, 가비아 등) → SMS 수신 단말
이메일
- 알림 제공자 → 이메일 서비스 (Sendgrid, Mailchimp, 네이버, 구글 등) → 이메일 수신 단말
연락처 정보 수집 절차
설계에서는 한 사용자가 여러 단말을 가질 수 있고, 알림은 모든 단말에 전송되어야 한다는 점을 고려함.
결국, 계정 등록시 사용자의 정보를 아래와 같은 형태로 받게 설계함.
알림 전송 및 수신 절차
개략적 설계
- 알림을 요청하는 N개의 서비스 존재 → 크론잡 또는 마이크로서비스 등 일 수 있다.
- 알림 시스템은 알림 전송을 위한 API를 제공해야 하며, 제3자 서비스에게 전달할 알림 페이로드를 만들어낼 수 있어야 함.
- 제3자 서비스는 사용자에게 알림을 실제로 전달하는 역할 (대부분 외부 툴) → 설계 시, 확장성을 염두해야 함. 쉽게 서비스를 추가/수정/삭제 할 수 있도록 설계 필요.
이 개략적 설계에서는 알림 서비스가 하나의 컴포넌트로 존재하며 여러 문제를 유발 할 수 있음.
- SPOF, 규모 확장성(DB, cache 확장 불가), 성능병목 등
개선된 설계
- DB, Cache를 서버에서 분리
- 알림 서버 증설 → Scale out이 가능하도록 구성
- MQ 이용 → 시스템 컴포넌트 간 의존도를 줄임
위의 구조에서 알림 서버(Notification server)는 다음 기능 제공
- 알림 전송 API, 알림 검증(validation), DB/Cache query, 알림 전송(to queue)
메시지 큐 사용
- 컴포넌트간 의존성 제거
- 다량의 알림이 전송되어야 하는 경우, 버퍼 역할도 가능
- 위 그림에서 왜 알림 종류마다 별도의 메세지 큐를 구성하였을까?
- 책에서 말하길 하나에 장애가 발생해도 다른 종류의 알림을 정상 동작하도록 별도의 큐로 구현.
- 사견)
- 장애를 막기 위해 별도의 큐로 구현한다는 것은 아예 별도의 메세지 큐를 구성하여 활용한다는 것? ⇒ 오히려 관리해야 할 컴포넌트가 증가하는 것 아닐까?
- 단일 메세지 큐로 두고 내부에서 여러 토픽을 나눠 활용하는 편이 오히려 깔끔할 것 같다는 개인적인 생각? 이렇게 되면 장애가 발생하면 문제가 생길 수 있지만, 알림 실패 재시도 로직을 추가해놓는다면 상관 없지 않을까?
3단계, 상세 설계
데이터 손실 방지
- 알림 시스템은 알림 데이터를 DB에 보관하고 재시도 메커니즘을 구현해야 함.
- 알림 로그를 DB에 유지하는 것도 하나의 방법 → 이를 사용하여 재시도 메커니즘?
재시도 방지
- 작업 서버에 보내야 할 알림이 도착하면 이벤트 ID를 검사하여 이전에 보낸 적이 있는지 확인
- 알림 로그를 사용
- 계속해서 DB/Cache query? ⇒ 1차적으로 Bloom filter를 이용해 query 전 확인?
알림 설정
- 사용자가 알림 설정으 상세히 조절할 수 있도록
알림 설정 테이블
을 이용. - 알림 수단마다 허용 여부를 확인 → 알림 보내기 전 필터링 필요
재시도 방법
- 제 3자 서비스가 알림 전송 실패하면, 재시도 전용 큐에 넣어 알림 재시도
- 같은 문제가 발생하면 개발자에게 알림(alert)
- 재시도 전용 큐에 넣을 때, retry 횟수도 넣어야 될 듯?
큐 모니터링
- MQ가 중추적인 역할을 하다보니, 모니터링 필요.
- 쌓인 알림의 개수를 보면서 처리가 잘 되고 있는지 확인.
최종적으로 수정된 설계안
320x100
반응형
'Book' 카테고리의 다른 글
[책] AI 변호사 with 챗GPT (4) | 2024.08.25 |
---|---|
[실용주의 프로그래머] Topic 1 ~ 5 (1) | 2022.03.29 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 7장 - 분산 시스템을 위한 유일 ID 생성기 설계 (2) | 2022.02.18 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 4장 - 처리율 제한 장치의 설계 (0) | 2022.02.01 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 3장 - 시스템 설계 면접 공략법 (0) | 2022.01.30 |
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- k8s
- gradle
- Kubernetes
- 알고리즘
- container
- python
- java
- hexagonal architecture
- Algorithm
- 일상
- Intellij
- 로그
- 클린 아키텍처
- Spring boot
- Spring
- c++
- tag
- Clean Architecture
- Istio
- boj
- 하루
- jasync
- HTTP
- 비동기
- WebFlux
- docker
- 쿠버네티스
- MySQL
- Log
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함