10장. 알림 시스템 설계
- 알림 시스템은 모바일 푸시 알림, SMS 메시지, 이메일의 세 가지로 분류할 수 있습니다.
#
1단계 문제 이해 및 설계 범위 확정- 요구사항
- 푸쉬 알림, SMS 메시지, 이메일 모두 지원 필요
- 연성 실시간 시스템 (가능한 빨리 필요하나, 약간의 지연은 괜찮음)
- ios, android, 데스크톱을 지원해야함
- 클라이언트 애플리케이션 프로그램 혹은 서버 측의 스케줄링
- 사용자가 알림을 받지 않도록(opt-out) 설정할 수도 있습니다.
- 하루에 첫만 건의 모바일 푸시 알림, 백만 건의 SMS 메시지, 500백만 건의 이메일을 보낼 수 있어야 함.
#
2단계 개략적 설계안 제시 및 동의 구하기- 아래와 같은 이야기에 대해 이야기합니다.
- 알림 유형별 지원 방안
- 연락처 정보 수집 절차
- 알림 전송 및 수신 절차
#
알림 유형별 지원 방안#
iOS 푸시 알림- ios에서 푸시 알림을 보내기 위해서는 세 가지 컴포넌트가 필요합니다.
- 알림 제공자(provider)
- APNS: 애플이 제공하는 원격 서비스
- iOS 단말: 푸시 알림을 수신하는 사용자 단말입니다.
#
안드로이드 푸시 알림- iOS와 비슷하나 APNS 대신 FCM(Firebase Cloud Messaging)을 사용합니다.
#
SMS 메시지- 보통 제 3사업자의 서비스를 많이 사용합니다.
#
이메일- 대부분이 회사는 고유 이메일 서버를 구축할 역량이 있으나 상용 이메일 서비스를 이용합니다.
#
연락처 정보 수집 절차- 알림을 보내려면 모바일 단말 토큰, 전화번호, 이메일 주소 등의 정보가 필요합니다.
#
알림 전송 및 수신 절차#
개략적 설계안 (초안)- SPOF(Single-Point-Of-Failure): 알림 서비스에 서버가 하나밖에 없다는 것은, 그 서버에 장애가 생기면 전체 서비스의 장애로 이어집니다.
- 규모 확장성: 한 대 서비스로 푸시 알림에 관계된 모든 것을 처리하므로, 데이터베이스나 캐시 등 중요 컴포넌트의 규모를 개별적으로 늘릴 수 없습니다.
- 성능 병목: 알림을 처리하고 보내는 것은 자원을 많이 필요로 하는 작업일 수 있습니다. 즉, 트래픽이 몰리면 과부하 상태에 빠질 수 있습니다.
#
개선된 버전 (초기버전)- 데이터베이스와 캐시를 알림 시스템의 주 서버에서 분리
- 알림 서버를 증설하고 자동으로 수평적 규모 확장이 이루어질 수 있도록 합니다.
- 메시지 큐를 이용해 시스템 컴포넌트 사이의 강한 결합을 끊습니다.
- 알림 서버
- 알림 전송 API
- 알림 검증
- 데이터베이스 또는 캐시 질의
- 알림 전송
- 캐시: 사용자 정보, 단말 정보, 알림 템플릿 등을 캐시합니다.
- 데이터베이스(DB): 사용자, 알림, 설정 등 다양한 정보를 저장
- 메시지 큐(message queue): 시스템 컴포넌트 간 의존성을 제거하기 위해 사용
- 작업 서버(workers): 메시지 큐에서 전송할 알림을 꺼내서 제3자 서비스로 전달
#
3단계 상세 설계- 아래의 내용에 대해 더 자세하게 봅니다.
- 안정성(reliability)
- 추가로 필요한 컴포넌트 및 고려사항
- 개선된 설계안
#
안정성- 데이터 손실 방지
- 알림 중복 전송 방지
#
추가로 필요한 컴포넌트 및 고려사항- 알림 템플릿
- 알림 설정
- 전송률 제한
- 재시도 방법
- 푸쉬 알림과 보안
- 큐 모니터링
- 이벤트 추적
#
수정된 설계안#
4단계 마무리- 개략적 설계안과 더불어 각 컴포넌트의 구현 방법과 최적화 기법에 집중했으며, 아래의 주제에 대해 이야기했습니다.
- 안정성
- 보안
- 이벤트 추적 및 모니터링사용자 설정