Message Queue

메시지 큐는 메시지를 송신자에서 수신자로 안전하게 전달하고, 메시지를 보낸 시간과 관계없이 메시지 큐에 쌓여 있는 메시지들을 비동기 적으로 처리할 수 있도록 해줍니다.

Untitled

메세지 큐를 사용한 이유는 다음과 같습니다.

  1. 비동기 통신: 메시지 큐를 사용하면 시스템의 다양한 부분 간에 비동기적으로 통신할 수 있습니다. 이는 각 컴포넌트가 독립적으로 작동할 수 있도록 하고, 시스템 전반의 유연성과 확장성을 향상시킵니다.
  2. 최소 한 번의 전송: 푸시알림의 경우 메시지가 소비자에게 전달되면 적어도 한 번은 성공적으로 전송되었다고 보장되어야 합니다. 이는 메시지의 중복 전송이나 손실을 방지하고 안전한 데이터 전달을 보장합니다.
  3. 탄력성 및 안정성: 푸시 기능은 FCM 서버에 의존적이므로 FCM 서버가 장애가 생기면 해당 기능에 문제가 생길 수 밖에 없습니다. 메시지 큐는 일부 컴포넌트가 일시적으로 사용 불가능한 경우에도 메시지를 안전하게 저장하고, 작업을 대기 시킬 수 있습니다. 이는 시스템의 안정성을 향상시키고 장애 발생 시에도 데이터의 일관성을 유지하는 데 도움이 됩니다

BullMQ

Message Queue를 제공하는 여러 기술들이 있지만 저는 BullMQ를 선택했습니다. BullMQ는 Node.js를 기반으로 작성되었으며, 설치 및 설정이 간단합니다. 프로젝트의 기간이 얼마 남지 않았기에 구현 하면서도 시간을 많이 들이지 않도록 하기 위해서였습니다. 또한 큐 전략 중 최소 한 번의

서버 구조

Untitled

푸시 기능에 필요한 요구사항들을 작업하기 위해 생성된 worker에 process들은 다음과 같습니다.

  1. save-token: 사용자가 FCM SDK에서 발급받은 토큰을 저장합니다.
  2. resolve-toke: 사용자 고유 정보를 기반으로 해당 토큰을 찾아줍니다.
  3. send-notification: resolve된 token을 전달 받아 FCM Server에 요청을 보냅니다.