본문 바로가기
★ 프로젝트 + 트러블 슈팅 ★

[FCM] Firebase Cloud Messaging deprecated API 이슈

by 리승우 2024. 9. 13.

이슈 내용

평소와 다름없이 업무를 하던 중, 사업팀 측에서 CS 문의가 왔다. 

내용인즉, 현재 관리자 운영툴에서 유저에게 이벤트 푸시 메시지를 보내고 있는데, 18만명에게 메시지를 보내는 일이 있어도 읽은 사람이 0에 수렴하는 결과가 보인다는 것이였다.

 

10건을 보냈는데 0명이 봤다하면 기능에 이상이 있다고 의심하지는 않겠지만 18만명은 좀...

 

현재 FCM을 사용하고 있는데, 실제로 푸시 메시지를 발송하고 있는 지 테스트를 해본 결과

deprecated api 라는 결과가 떴다.

 

 

아! 정상작동할 수 있도록 바꿔야겠다.

 

이전에는 대규모 푸시 메시지 발송을 하면 유저에게 도착하기까지 시간이 꽤 지연된다는 이슈가 있었는데, 이것도 고려해야 하는 상황이 왔다.

 

헌데 추석 기념으로 대규모 유저에게 이벤트 푸시 메시지를 보내야 하는 일이 생겨 개발기한은 영업일 기준 약 8일정도였다. 

최대한 간편하고 좋은 방법으로 진행해야 했다.

 

해결 과정

1. 대체 방안 선정 (관련 자료 리서치)

2. 개발환경 세팅 및 부가설정 진행

3. 개발 진행

4. 테스트

5. 운영환경 배포

 

1. 대체 방안 선정

- FCM v1

- FCM Topic

- FCM Admin SDK

 

FCM V1

- FCM HTTP 지원 종료에 따라 공식문서에서 추천하고 있는 V1 HTTP API.

- 보내기 위해선 google 인증 API를 호출하여 토큰을 획득한 뒤, V1 HTTP API의 인증 헤더에 해당 토큰값을 넣어줘야 함

- 최대 500건까지만 지원함 (500건 이상일 경우 여러번 호출해야한다는 뜻)

 

채택 진행 시

  1. google 인증 API 호출과정 추가 (토큰 획득)
  2. HTTP -> V1 HTTP API 변환 및 헤더에 토큰 넣어서 호출되게 변경

FCM Topic

- FCM V1 HTTP API를 사용해야 함

- 특정 Topic(주제)에 사용자의 device token 값을 구독설정하면, Topic을 선택해서 푸시하게 되면 구독한 사용자 전체에게 메시지가 발송됨

- Topic 생성 가능한 최대 개수는 모름 (공식문서 어느 곳에도 보이지 않았음..)

- 하나의 앱 인스턴스(앱을 설치한 기기별 디바이스)는 최대 2,000개까지만 Topic을 구독할 수 있음
(SNS와 같이, 2,000명 이상을 팔로우한 후, 팔로우한 상대방의 행동에 따른 모든 알림을 받을 수 있게 지원하기엔 무리가 있는 제약)

 

채택 진행 시

  1. 클라이언트 애플리케이션 → AOS, IOS에서 특정 토픽을 구독
    1. 서버측에서도 사용자를 토픽에 구독시키거나 해지시키는 API를 사용할 수 있으나, 주로 클라이언트에서 하는 것이 일반적임
      (굳이 서버에서 할 필요도 크지 않은 것으로 보임)
  2. 서버측에서 FCM(Firebase Cloud Messaging) API를 통해 특정 토픽에 구독된 모든 클라이언트에게 메시지를 전송함
    (v1 HTTP API사용)
    1. google 인증 API 호출하여 토큰 획득
    2. FCP v1 notification API 호출 시 토큰 값을 인증 헤더값에 넣음
  3. 토픽을 구독한 사용자는 Firebase Push를 받게 됨

=> 어떤 작업을 할 때, 어떤 주제로 구독을 시킬지 Topic명 규격을 하나하나 세워줘야할 것 같음
(관리포인트 및 이런 과정들이 시간대비 이득이 클지 의문)

 

 

FCM Admin SDK

- SDK 설치해서, 지원하는 기능들을 사용하는 방안

- 원하는 기능만 선별해서 사용하면 되므로 간편함 (확인 결과, 아래 2개 기능 중 선별하여 쓸 것 같음)

  1. sendMulticast()
    1. 1개의 메시지를, 여러 기기에 보낼 때 사용
  2. sendAll()
    1. 여러 개의 다른 메시지를 여러 기기에 나눠 보낼 때 사용

 

결정된 방안

FCM Admin SDK

1. sendMulticast 사용

2. 해당 기능도 최대 500개까지만 지원하므로, 병렬 실행이 가능하도록 Guzzle을 사용

=> 500개씩 여러 개 병렬실행 함으로써 기존에 지연되던 발송 시간을 단축

 

- FCM V1 HTTP 미채택 이유

1. SDK가 더 사용하기 간편해 보여서

 

- FCM Topic 미채택 이유

1. 하나의 앱 인스턴스는 최대 2,000개까지만 Topic을 구독할 수 있음

2. 유저가 구독할 Topic명 규격화 및 관리포인트 정하는 과정이 개발기간을 고려했을 때 효율적인 작업으로 보이지 않음

 

2. 개발환경 세팅 및 부가설정 진행

메시지 발송 여부 체크해야하니, Docker로 환경 구성 및 아래 FCM Admin SDK 문서에서 요구하는 환경 세팅

- Composer 설치

- Composer 이용하여 FCM Admin SDK 설치

- Guzzle 설치

https://firebase-php.readthedocs.io/en/stable/overview.html

 

3. 개발 진행

아래 FCM Admin SDK 문서에 맞게, sendMulticast() 진행 및 Guzzle 적용

https://firebase-php.readthedocs.io/en/stable/cloud-messaging.html#send-messages-in-batches

 

4. 테스트

푸시 메시지 발송 테스트 진행

 

5. 운영환경 배포

운영환경 배포 후 이상없는지 모니터링 

 

 

 

 

댓글