*푸시 알림
- 채팅, 키워드알림, 금주의인기매물 등 여러 기능에 사용
- 당근마켓 메인 Ruby on Rails 서버에 구현되었었던 푸시알림 서비스를 트래픽 증가에 따라 마이크로 서비스로 분리하는 작업이 필요
- 초당 1500 요청을 누락 없이 지원하는 푸시 서비스를 Node.js, TypeScript로 개발
*푸시 서비스의 역할
- 푸시 토큰 관리 : 토큰 등록, 중복 토큰 제거, 만료된 토큰 삭제
- FCM, Kakao 푸시 서버 요청 장애시 알아서 failover 및 retry
- 당근마켓 트래픽 증가에 따른 손쉬운 horizontal scale-up
- 당근마켓은 중고거래가 실시간 채팅으로 이루어지기 때문에 푸시 서비스에 아무리 많은 트래픽이 발생해도 안정적으로 지원해야 한다.
- 각 구성요소에 일시 장애가 나더라도 받은 요청은 모두 수행할 수 있는 구조를 채택
- 서버와 워커를 분리하고 푸시 서비스 내에서 발생하는 모든 작업은 Task Queue를 통해 관리하도록 구상
*Server(Express.js)
- 서버의 역할은 초당 1500 요청이 넘을 수 있는 트래픽을 우선 받아내는 것
- 정말 간단한 요청 파라미터 validation만 수행하고 바로 job을 생성하여 task queue로 넘김
- 무난한 Express.js 을 사용해서 구현, validation은 TypeScript와 시너지가 좋은 class-validator를 사용
- 무거운 워커 작업에 의해 요청을 못 받아내는 경우를 줄이기 위해 따로 서버와 워커를 다른 인스턴스로 운용하도록 결정
- 5개의 인스턴스로 운영되고 있는 서버는 평균 초당 1000요청에 5ms 응답속도를 가지고 있음
*Task Queue(Bull.js)
- Bull.js는 Node.js 생태꼐에서 많이 사용되는 queue system 구현체 중 하나
- Backend는 Redis를 쓰고 있고 queue 전략 중 "최소 한 번 전달" (at least once delivery)를 채택하고 있음
- retry, prioritym concurrency 등 많은 기능을 지원하고 API도 직관적
- 공식 UI 대시보드가 없다. (bull-board로 처리 중인 작업 개수 정도만 확인 가능)
- 푸시 서비스에서 발생하는 모든 작업은 Task Queue로 관리됨
- 사용자에게 푸시를 전송하는 과정
- 1. 유저 아이디 값으로 토큰 정보를 조회하는 job을 만든다.
- 2. FCM이나 Kakao 푸시 서버로 전송하는 job을 만든다.
- 모든 작업을 job 단위로 분리하여 각 job의 평균 처리 시간을 수집하여 성능 모니터링, horizontal scaling에 대한 수요를 빠르게 파악할 수 있음
- 각 외부 dependency 별로 job을 분산했기 때문에 외부 dependency의 장애에 대한 파악이 쉬움
'스타트업' 카테고리의 다른 글
[스타트업] 루비온레일즈 (0) | 2020.08.14 |
---|---|
[스타트업] Kotlin (0) | 2020.08.14 |
[스타트업] 당근마켓 스토리 (0) | 2020.08.09 |
피아노 코드 연주법 (0) | 2020.08.06 |
7 (0) | 2020.08.06 |