Closed JasonYoo1995 closed 2 years ago
@caffeine-library/readers-system-design-interview
책이 고안한 설계를 보면서, 컴포넌트들이 무슨 퀄리티 속성을 만족하려고 등장한 것일까 생각하게 되었습니다. 뭔가 수필 쓰듯이 쓰게 되었네요.
대학 과제로 안드로이드 앱에서 푸시 알림을 수신하기 위해 그 내용을 팠던적이 있다. 당시 생각해낸 알림 보내기란, 앱이 직접 FCM에 쿼리를 날려 기기가 다시 알림을 수신하는 수준이었다. 알림 전송 기능의 참여자는 앱, 기기, FCM 3개 뿐이다.
하지만 이 책(System Design Interview)에서 설계하는 것은 서비스 수준 즉, 알림 서비스이다. 만족해야 할 퀄리티가 있으며, 이를 위해 10개의 컴포넌트가 식별되었다.
서비스의 뼈대 시나리오는 이렇다.
클라이언트 서비스는 다수 존재한다. 클라이언트는 알림을 수신했으면 하는 유저의 ID와 알림 컨텐츠, 타겟 플랫폼을 HTTP 페이로드에 욱여넣고 알림 서버에 요청한다.
알림 서버는 타겟 정보 데이터베이스, 알림 설정 데이터베이스를 참고하여 타겟 플랫폼 별로 마련된 알림 요청 큐에 작업을 넣는다. 작업 서버가 큐에서 이것을 꺼내고 지정된 플랫폼의 제3자 알림 서비스(FCM 따위)에게 알림을 전파한다. 유저의 기기는 곧이어 알림을 수신하게 된다.
다음과 같은 퀄리티가 고려된다.
Low Coupling
알림 서버와 작업 서버 간 결합을 낮추기 위해 큐 시스템을 사이에 도입한다. 중국 대상으로 서비스 지역이 확장될 때, 작업 서버는 제3자 서비스 마이그레이션에 영향을 받는다 (Jpush, PushY) 하지만 알림 서버는 이런 변경을 고려하지 않는다.
Reliability (안정성)
큐는 위 역할 뿐만 아니라, 알림 전송이 실패하는 케이스가 발생시, 그 알림을 재전송하도록 하는 윤활제가 된다. 작업 서버가 실패된 알림을 겪으면 큐에다 다시 재인큐 해주면 되기 때문이다. = 폴백 루틴의 설계가 단순해졌다.
Traceability (추적성)
큐가 담고있는 작업의 사이즈는 계속 추적하여 작업 부하량을 판단하는 데 쓸 수 있다. 이 값을 토대로 작업 서버나 알림 서버의 증설을 고려할 수 있다.
알림 로그 데이터베이스는 제3자 알림 서비스에 위탁한 알림이 제대로 처리되었는지 기록한다. 이 값을 토대로 작업 서버는 실패된 알림을 발견하고 다시 재전송을 시도할 수 있다.
시스템의 각 컴포넌트는 추적하고 싶은 상태 메트릭을 데이터 분석 서비스에 전송한다. 추적 지표들은 서비스 개선에 활용될 것이다. 책에서는 알림의 상태를 추적한다.
Security (보안)
알림 서비스는 스팸 따위로 악용될 수 있으므로, 알림 서버는 인증 모듈을 두어 허용된 클라이언트만이 이용하게 한다.
Performance (성능)
알림 템플릿을 만들어 두고 파라미터 값을 조정하는 방식을 쓰면, 작업 서버는 신속하게 알림 메시지를 작성할 수 있다.
영속성 레이어에 캐시들을 배치해 놓았고, DB도 다중화했다. 읽기 지연이 상당히 감소한다.
유저 만족도
유저에게 과한 양의 알림이 수신되거나 동일한 알림이 중복 수신되는 경우 사용성을 크게 떨어뜨린다. 알림 서버는 처리율 제한 장치를 두어 특정 기간 동안 한 유저가 수신할 수 있는 알림 개수를 설정할 수 있으며, 참고 문헌 5의 방법으로 중복 전송 확률을 낮춘다.
유저는 그냥 클라이언트로 가서 알림 수신 설정을 끄는 방식을 쓸 수도 있다. 알림 설정 데이터베이스에 이 정보가 저장된다.
Availability (가용성)
타겟 정보 데이터베이스, 알림 설정 데이터베이스, 캐시, 알림 로그 데이터베이스, 알림 템플릿 캐시, 알림 서버, 작업 서버를 다중화한다.
관점을 역전시켜서 컴포넌트의 존재 의의를 분석할 수 있다.
큐 시스템의 의의
처리율 제한기의 의의
주제
'10장 - 알림 시스템 설계'을 읽고 내용을 요약하거나,
중요✨ 하다고 생각하는 키워드 및 관련 설명을 코멘트로 달아주세요
연관 챕터
30
@caffeine-library/readers-system-design-interview