알림 시스템 질문 : 알림 시스템의 확장
현재 알림 시스템은 알림 전송 서버를 한대만 사용하고 있습니다. 최근 이 알림 서버에 장애가 발생하여 알림 시스템 전체가 동작하지 않는 문제가 있었습니다. 이 문제를 시스템 아키텍처를 수정하여 해결하려고 하는데, 어떻게 해결하면 좋을지 의견을 제시해주세요.
- 알림 전송 서버를 여러대 두어 확장하면 됩니다. 이때 각 알림 이벤트의 전송은 사용자의 단말에 따라 다른 외부 서비스를 사용하므로, 알림 종류별로 전송 서버를 따로 두면 좋을 것 같습니다. 예를 들어 안드로이드 단말에 알림을 전송한다면 FCM을 사용하므로, FCM과 의존성을 맺는 전송 서버를 따로 두는 것입니다.
- 이렇게 되면 각 서비스들로부터 알림 전송 API를 제공하는 알림 서버와 실제 알림을 전송하는 작업을 하는 작업 서버의 책임이 달라지므로 분리합니다. 알림 서버는 알림 전송 요청을 받아 검증하는 역할과 알림 종류에 따라 각각 다른 작업 서버에 전달하게 됩니다. 전송 서버는 알림 서버로부터 받은 정보로 알림을 만들고 자신이 알고있는 외부 서비스를 통해 전달하는 역할을 합니다.
- 이때 알림 서버와 전송 서버 사이에 큐를 두어 이벤트 드리븐 방식으로 전환하면 비동기적인 알림 전송을 달성할 수 있습니다. 또 컴포넌트 사이의 의존성을 제거할 수 있으며, 대량의 알림 전송 요청이 들어오면 큐가 버퍼 역할을 하므로 처리량을 조절할 수 있습니다.
뉴스 피드 시스템 질문 : 푸시 모델 vs 풀 모델
포스팅 전송 서비스에 적용할 모델로 푸시 모델과 풀 모델을 비교해보세요.
- 푸시 모델 : 새로운 포스팅이 업로드되면 알고있는 모든 친구의 피드에 해당 포스팅을 추가하는 방법을 말합니다. 푸시 모델은 작성 시점에 데이터를 갱신하므로 읽기 속도가 빠르지만, 친구가 많은 사용자의 팬아웃은 피드 갱신에 많은 속도가 걸릴 수도 있고, 서비스를 자주 이용하지 않는 사용자의 피드를 갱신해야하므로 컴퓨팅 자원 낭비가 발생할 수 있습니다.
- 풀 모델 : 어떤 회원이 피드 읽기를 시도했을 때 피드를 갱신하는 방법을 말합니다. 풀 모델은 자주 로그인하지 않는 사용자에 대한 컴퓨팅 자원을 아낄 수 있으며 핫키 문제도 발생하지 않습니다. 다만 피드를 읽을 때 시간이 오래 걸립니다.
- 절충안 : 일반적인 사용자들에게 빠른 피드 읽기는 중요합니다. 따라서 일반 사용자들에게는 푸시 모델을 사용하되, 친구가 매우 많아서 핫키 문제가 발생할 수 있는 사용자에 대해서는 풀 모델을 적용하는 편이 좋습니다.