10. 알림 시스템 설계

1. 문제 이해 및 설계범위 확장

  • 어떤 종류의 알림을 지원?

    • 푸시 알림, SMS, 이메일

  • 실시간 시스템?

    • soft real-time

      • 알림은 가능한 빨리 전달, 시스템에 높은 부하가 걸렸을 때 약간의 지연은 무방

  • 어떤 종류 단말?

    • IOS, 안드로이드, 랩톱/데스크압

  • 사용자에게 보낼 알림은 누가 만들어야함?

    • 클라이언트 어플리케이션

    • 서버 측에서도 가능

  • 사용자가 알림을 받지 않도록 설정(opt-out) 가능?

    • yes

  • 하루에 몇건의 알림?

    • 천만건 모바일 푸시

    • 백만건 SMS

    • 5백만건의 이메일

2. 개략적 설계안 제시, 동의 구하기

IOS 푸시 알림

![[Pasted image 20251004135518.png]]

  • APNS : 애플이 제공하는 원격 서비스, 푸시 알림을 IOS 장치로 보내는 역할을 담당

    • Apple Notification Service

안드로이드

![[Pasted image 20251004135606.png]]

  • FCM : Firebase Cloud Messaging

SMS 메세지

  • Twilio, Nexmo 같은 상용 서비스 이용함. 이용 요금 필요함

이메일

  • Sendgrid, Mailchimp 상용 서비스

연락처 정보 수집 철자

  • 알림을 보내래면 모바일 단말 토큰 ,전화번호, 이메일 주소등의 정보가 필요함

![[Pasted image 20251004135754.png]]

  • 사용자가 여러개의 단말을 가질 수 있음.

  • 알림은 모든 단말에 전송되어야함.

개략적인 설계 (초안)

![[Pasted image 20251004135852.png]]

  • 문제

    • SPOF : 알림 서비스가 서버 하나. 알림 시스템이 장애면 전체 서비스 장애임.

    • 규모 확장성 : 한 대의 서비스로 푸시 알림에 관계된 모든 것을 처리. 데이터베이스나 캐시등의 중요 컴포넌트의 규모를 개별적으로 늘릴 방법이 없음.

    • 성능 병목 : 트래픽이 몰리면 알림 서비스가 병목일 수 있음.

개략적 설계안 (개선)

![[Pasted image 20251004140046.png]]

  • 데이터베이스오와 캐시를 알림 시스템의 주 서버에서 분리

  • 알림 서버 증설, 자동으로 수평적 규모 확장이 이뤄질 수 있도록

  • 메세지 큐를 이용해 시스템 컴포넌트 사이의 강한 결합을 끊음

  • 알림 서비스는 다음 기능을 제공

    • 알림 전송 API : 사내 서비스, 인증된 클라언트가 사용가능하도록 API 제공

    • 알림 검증 : 이메일 주소, 전화번호 등에 대한 기본적 검증 수행

    • 데이터베이스 또는 캐시 질의 : 알림에 포함시킬 데이터를 가져오는 기능

    • 알림 전송 : 알림 데이터를 메세지 큐에 넣음

3. 상세 설계

안정성

  • 데이터 손실방지 :

    • 알림 전송 시스템의 가장 중요한 요구사항, 어떤 상황에서도 알림이 소실되면 안된다.

    • 지연, 순서가 틀려도 괜찮지만, 사라지면 안된다.

    • 이를 위해서는 알리 시스템은 알림 데이터를 데이터베이스에 보관하고, 재시도 매커니즘을 구현해아힘

  • 중복 전송 방지 :

    • 분산 시스템 특성상 가끔은 같은 알림이 중복되어 전송.

    • 그 빈도를 줄이려면 중복을 탐지하는 매커니즘을 도입해야함

추가 고려사항

  • 알림 템플릿

  • 알림 설정

  • 전송률 제한

  • 재시도방법

  • 푸시 알림과 보안

  • 큐 모니터링

    • 큐의 쌓인 알림 개수가 많으면... 알림 오도록

  • 이벤트 추적

수정된 설계안

![[Pasted image 20251004141152.png]]

  • 전송 실패 대응 -> 재시도 기능 추가

  • 전송 템플릿 사용 -> 알림 생성 과정 단순화, 알림 내용 일관성 있게

  • 모니터링, 추적 시스템 추가 -> 시스템 상태 추적. 시스템 개선

4. 마무리

Last updated

Was this helpful?