Kafka를 먼저 읽어보시면 이해가 더 잘되실겁니다.

도입기

기존에는 node 서버가 요청을 받아서 데이터를 가공하여 FCM으로 전달하는 서버로 구성되어 있었는데, 몇가지 문제가 있었습니다.

  1. 토큰 만료 여부(Response)를 받지 않고 무조건 쏘기만 하고 있었음
  2. 프로젝트 아이디만 다른 같은 소스를 복붙하여 폴더를 여러개 만들어 프로세스를 여러개 띄워 nginx에서 바라보게 해놨음
  3. 모니터링이 안달려있음
  4. (하나의 소스로 합칠 경우)프로젝트 ID를 추가해야 할 때 기존 푸시 서비스가 일시적으로 마비될 수 있음

기존 로직

Request-Reply 패턴 적용하여 구현한 Kafka 로직


이번 도입에선 FCM 키가 만료되었을 경우 삭제를 위해 Request-Reply 패턴을 적용하여 Response를 받고있습니다.

고려점

  1. 이후에 프로젝트 ID가 추가될 때 Topic을 추가하지 않고**(Producer를 수정하지 않고)** Consumer의 코드만 수정하면 되도록 판단 로직을 Consumer에 넣기 기존 push는 정상적으로 가는 것을 보장할 수 있게 처리. Rolling을 하든 Blue/Green을 하든 기존 push에 영향이 없어야 함.
  2. 수신자가 같은 경우 순서가 보장될 수 있도록 하기 fcm token을 key로 하여 동일한 파티션으로 분배되게 처리. 같은 파티션 내에선 순서가 보장됨.
const keyVal = {
  key: payload.pushData.token,	// 메시지 키로 pushData.token 값을 사용
  value: payload           		// 메시지 본문에 pushData 전체를 포함
};
const result$ = this.clientKafka.send(kafka_topic, keyVal);
  1. UNREGISTERED 에러가 발생할 경우, DB에서 해당 push_id 삭제 Request-Reply 패턴 적용. Producer에서 응답 토픽을 구독, 요청-응답 매핑(correlation id)을 추가
  2. 모니터링 달기 아직 시도중