정기간행물/daily

알림 시스템 설계

:)jun 2023. 9. 29. 20:56

알림 시스템

  • 모바일 푸시 알림
  • SMS 메시지
  • 이메일

1단계 문제 이해 및 설계 범위 확정

  1. 푸시 알림, SMS 메시지, 이메일
  2. 연성 실시간 시스템 (soft real-time)
  3. ios, android 단말, 랩탑, 데스크탑 지원
  4. 클라이언트 어플리케이션 또는 서버에서 스케줄링 할 수 있다.
  5. 사용자가 알림을 받지 않도록(opt-out) 설정할 수도 있다.
  6. 하루에 천만 건의 모바일 푸시 알림, 백만 건의 SMS 메시지, 5백만 건의 이메일

2단계 개략적 설계안 제시 및 동의 구하기

  • 알림 유형별 지원 방안
  • 연락처 정보 수집 절차
  • 알림 전송 및 수신 절차

알림 유형별 지원 방안

ios 푸시 알림

알림 제공자 → APNS → IOS 단말

  • 알림 제공자: 애플 푸시 알림 서비스(Apple Push Notification Service)로 보내는 주체 (단말 토큰, 페이로드를 보낸다.)
  • APNS: 애플이 제공하는 원격 서비스
  • IOS 단말: 푸시 알림을 수신하는 사용자 단말

안드로이드 푸시 알림

알림 제공자 → FCM(Firebase Cloud Messaging) → 안드로이드 단말

SMS 메시지

보통 트윌리오, 넥스모같은 제 3사업자의 서비스를 많이 이용한다.

알림 제공자 → SMS 서비스 → SMS 수신 단말

이메일

구축할 역량을 가지고 있지만 상용 이메일 서비스를 많이 이용한다.

알림 제공자 → 이메일 서비스 → 이메일 수신 단말

연락처 정보 수집 절차

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

처음 앱을 설치하거나 계정을 등록할 때 사용자의 정보를 수집하여 DB에 저장한다.

알림 전송 및 수신 절차

초안

  • 1부터 N까지의 서비스: 이 각각은 MSA일수도 있고, 크론잡일 수도 부산 시스템 컴포넌트일 수도 있다.
  • 알림 시스템: 이 시스템은 서비스 1~N에 알림 전송을 위한 API를 제공해야 하고, 제 3자 서비스에 전달할 알림 페이로드를 만들어 낼 수 있어야 한다.
  • 제 3자 서비스: 제 3자 서비스와의 통합을 진행할 때 유의할 것은 확장성이다.
  • IOS, 안드로이드, SMS, 이메일 단말: 사용자는 단말에서 알림을 수신한다.

초안의 문제점

  • SPOF: 알림 서비스에 서버가 하나 밖에 없다.
  • 규모 확장성: 한 대 서비스로 푸시 알림에 관계된 모든 것을 처리하므로, DB나 캐시 등 중요 컴포넌트의 규모를 개별적으로 늘릴 방법이 없다.
  • 성능 병목

개략적 설계안 (개선된 버전)

  • DB와 캐시를 알림 시스템의 주 서비스에서 분리한다.
  • 알림 서버를 증설하고 수평적 규모 확장이 이루어질 수 있도록 한다.
  • 메시지 큐를 이용해 시스템 컴포넌트 사이의 강한 결함을 끊는다.

전송 과정

  1. API를 호출하여 알림 서버로 알림을 보낸다.
  2. 알림 서버는 메타데이터를 캐시나 DB에서 가져온다.
  3. 알림 서버는 전송할 알림에 맞는 이벤트를 만들어서 이벤트를 위한 큐에 넣는다.
  4. 작업 서버는 메시지 큐에서 알림 이벤트를 꺼낸다.
  5. 작업 서버는 알림을 제3자 서비스로 보낸다.
  6. 제3자 서비스는 사용자 단말로 알림을 전송한다.

3단계 상세 설계

추가 설계 목록

  • 안정성
  • 추가가 필요한 컴포넌트: 알림 템플릿, 알림 설정, 전송률 제한, 재시도 메커니즘, 보안, 모니터링
  • 개선된 설계안

안정성

데이터 손실 방지

알림이 지연되거나 순서가 틀려도 괜찮지만, 사라지면 곤란하다.

알림 시스템은 알림 데이터를 데이터베이스에 보관하고 재시도 메커니즘을 구현해야 한다.

알림 중복 전송 방지

중복을 탐지하는 메커니즘을 도입하고, 오류를 신중하게 처리해야 한다.

추가로 필요한 컴포넌트 및 고려사항

알람 템플릿

알람 메시지 대부분은 형식이 비슷하다.

알림 설정

사용자가 알림 설정을 상세히 조정할 수 있도록 한다.

전송률 제한

재시도 방법

제3자 서비스가 알림 전송에 실패하면, 해당 알림을 재시도 전용 큐에 넣는다.

푸시 알림과 보안

iOS와 안드로이드 앱의 경우, 알림 전송 API는 appKey와 appSecret을 사용하여 보안을 유지한다.

큐 모니터링

이벤트 추적