개요
Google FCM 을 사용하여 안드로이드, 애플 앱으로 푸시 메세지를 발송하는 서버를 구현함
Flow
앱 푸시 서버 흐름도
Features
•
애플, 안드로이드 푸시 메세지를 발송
•
메세지 유형이 존재하고, 유형에 따라 시간 단위로 묶어서 보내는 기능
◦
예) 1분안에 동일 유형의 메세지가 동일 수신자에 발송되는 경우, 1개의 메세지로 축약해서 전송
◦
1분 동안 1건의 특정 유형의 메세지가 발송되어야 하는 경우, 원래 메세지로 발송
◦
1분 동안 2건 이상의 동일 유형의 메세지가 발송되어야 하는 경우, 미리 정해진 템플릿에 맞춰 1개의 메세지로 보냄
•
팔로워들에게 메세지를 발송해야하는 경우, 백엔드나 앱에서는 송신자와 메세지 1건을 팔로우 큐에 쌓음
◦
1건의 팔로우 큐 메세지당, 팔로워 리스트를 조회해서, 메세지를 생성하여, 발송 큐에 저장함
•
사용자별 특정 시간, 특정 메세지 유형에 따라 수신 여부 룰이 있어, 해당 룰을 사용하여 메세지를 보내거나 보내지 말아야 함
◦
백엔드나 앱에서는 해당 룰에 상관없이 큐에 쌓음
◦
수신 거부 메세지 유형에 대해서는 버림
•
메세지 발송 큐 처리
◦
메세지 건당 발송하지 않고, 50개씩 묶어서 배치 발송 처리
◦
사용사의 수신 확인 및 메세지 유형 확인하여 묶음 처리 또는 발송
Follow message
1.
앱이나 백엔드 서버에서 1:N 팔로우 메세지 1건을 Follow Queue 에 저장
2.
푸시서버의 Follow Thread 에서 Poll
3.
1:N 의 1인 이벤트 발생 사용자의 아이디를 Following 하는 Follower 사용자 아이디(들)을 조회
4.
1:N의 N 메세지를 생성하여, 우체통에 저장
5.
N 메세지를, Push Message Queue 에 저장
Following 1:N Message Process
Merge message
1.
Send Thread 에서 묶음 발송 메세지의 경우 Merge Message Queue 저장
2.
Merge Thread가 실행한 묶음 메세지 유형의 시간별 Merge Process Thread가
a.
시간이 되어도 1개의 메세지만 발생한 경우, 메세지 변경 없음
b.
2개 이상의 메세지 발생시, 묶음 메세지 템플릿에 맞게 메세지 변경
3.
Push Message Queue에 Merge 마킹하여 저장
Issue
현재 다른 프로세스들은 모두 여러 컨테이너에서 처리 되어도 문제 없지만, Merge Thread 의 경우, 여러 서버(ECS Scale Out)에서 처리될 경우, 시간차로 인해, 지정된 규칙보다 더 빨리 메세지가 전송 될 수 있음
해당 프로세스만 별도 프로세스로 분리하여 1대의 컨테이너에서만 실행되던지, Schedule 을 사용하여 1개의 프로세스가 처리하도록 해야함
최초 EC2로 적용하려고 했지만, 다른 어플리케이션도 모두 ECS상에 실행되어, 보안 규정이나 관리의 편의성을 위해 ECS로 구현하긴 함
방안
•
푸시서버에 한해서만 스케일 아웃 대신 스케일 업으로만 ECS 사용?
Send message
1.
앱, 백엔드, 또는 푸시 서버에서 Push Message Queue 로 발송할 메세지 저장
2.
Send Thread 에서 메세지 Poll
3.
사용자가 수신할 메세지 유형인지, 푸시 토큰, 묶음 발송해야하는 메세지인지 조회
4.
발송해야할 메세지의 경우 최대 50건씩 묶어서 Batch 전송
vs
묶음 발송해야하는 메세지 유형의 경우 Merge Message Queue 로 저장
Sending 1:1 Message Process