내용
FCM API를 사용해 프로그래밍 방식으로 Request Send를 build 하는 경우, 시간이 지남에 따라, 오래된 registration token
이 있는 비 활성기기에 메시지를 보내 리소스를 낭비할 수 있다.
이러한 상황은, Firebase에 보고된 메시지 전송 데이터 또는 BigQuery
로 내보낸 데이터에 영향을 미쳐, 전송률이 급격하게 감소할 수 있다.
이러한 점을 막기 위해 효율적인 메시지 타겟팅과 유효한 전송보고를 위해서 취할 수 있는 조치에 대한 것이다.
Basic Best practices
프로그래밍 방식으로 Request send를 build하기위해, 따라야하는 Fundamental practices
는 다음과 같다
1. 서버에 Registration Token
저장
→ 서버의 중요한 역할을 각 클라이언트의 Token
을 추적하고, 업데이트된 Active Tokens
목록을 유지하는 것이다. 코드와 서버에 Token Timestamp
를 구현하고, 정기적으로, 이 Timestamp
를 업데이트하는 것이 좋다
2. 저장이 오래된 Token
제거
→ invalid token
응답의 obvious
케이스 경우에 token
을 제거하는 것 뿐만아니라, token
이 오래되었다는 다른 현상들 또한 모니터링 해야 한다. 이를 위한 옵션에는 몇가지가 존재한다.
등록된 Registration Tokens 저장및 검색(retrieve)
처음 앱 시작시, FCM SDK는 클라이언트 앱 Instance
에 대한 Registration token
을 생성한다.
→ 이는 API로부터의 targeted send requests
에 포함하거나 targeting topics
을 위해 topic subscriptions
에 추가해야하는 token
이다.
클라이언트 Setup 가이드대로, 앱은 초기 시작시에(initial startup) 이 token
을 검색하고, 앱 서버에 timestamp와 함께 저장해야 한다.
해당 timestamp
는 FCM SDK에서 제공하지 않으므로, 스스로 구현해야 한다.
Timestamp 업데이트 주기
Token
을 서버에 저장하고 변경될때마다 업데이트 해야하는데 그 예시 상황은 다음과 같다
1. 앱이 새 기기에서 복원되는 경우
2. 유저가 앱을 제거/재설치 하는 경우
3. 유저가 앱 데이터를 지우는 경우
FCM Backend로부터 invalid token 응답을 감지
FCM에서 invalid token
응답을 감지하고, invalid
한 것으로 알려진 모든 registration tokens
들을 시스템에서 삭제해야 한다.
HTTP v1 API를 사용하는 경우, 이러한 오류 메시지는 전송 요청이 stale
하거나, invalid token
을 대상으로 함으로써 나타낼 수 있다.
UNREGISTERED
(HTTP 404)INVALID_ARGUMENT
(HTTP 400)
targeted token
에 대해 위와 같은 응답 중 하나를 수신하는 경우 해당 token
의 record
는 유효하지 않으므로, 삭제하는 것이 좋다.
그러나, token
이 유효하지 않음에도, indication
이 없는 경우가 여전히 존재한다.
예를 들어, FCM backend
는 기기가 영구적으로 오프라인 상태가 되었는지에 대한 여부를 확인할 수 는 없다.
Registration Token fresheness 보장
Token
이 최신인지 여부를 판단하는 것은 간단하지는 않다.
모든 케이스를 다루기 위해서는 Token
이 오래되었다고 간주하는 경우에 대한 임계값을 설정해야 하며, 그 권장 기간은 2개월이다.
2개월 이상된 모든 Token은 inactive 기기일 가능성이 높다.
그렇지 않으면 active
기기가 token을 새로 고쳤을 것이기 때문이다.
정기적인 Token Update
서버에서 모든 registration tokens
에 대해 주기적으로 검색하고 업데이트 하는것이 권장된다. 이를 위해선 다음을 필요로 한다.
클라이언트 앱
에 앱 로직을 추가해, 적절한 API 호출을 사용해 현재 토큰을 검색한다.
(Apple
에선token(completion):
,Android
에선getToken()
사용)
이후, 현재의token
을 앱 서버 저장소에 저장하기위해 타임스탬프를 포함해 보낸다.
이것은 모든 클라이언트/토큰들을 포함하는 monthly 작업이 될 수 있다.
(This could be a monthly job configured to cover all clients/tokens.)Token
의 변경여부에 관계없이, 정기적으로token
의timestamp
를 업데이트하는 서버 로직을 추가한다
어떤 timing
패턴을 따르든, Token
을 주기적으로 업데이트해야 한다.
권장되는 Token Update 주기
1달에 1번 업데이트 빈도는, 배터리 영향과 inactive registration token 감지간에 good balance를 이룰 가능성이 높다.
이 refresh
을 수행하면, inactive
된 기기가 다시 활성화 될 때 registration
를 새로 고치도록 할 수 있다.
refresh
주기를 1주 이하로 줄이는 경우엔 더이상의 이점이 없다.
Topics으로부터 오래된 토큰(stale token) 구독취소 (unsubscribe)
오래된 registration tokens
을 제거하기 위해, topics subscription
을 관리하는 것도 또 다른 고려 사항중 하나이다. 이 방법에는 2가지 단계가 포함된다.
1. 앱은 1달에 1번
, 또는 registration token
이 변경될 때마다, topic
을 다시 subscribe
해야 한다. 이는 앱이 다시 active될때 subscription
이 자동으로 reappear
하는, self-healing solution
이다.
2. 만약 앱 Instance
가 2달동안(혹은 자체적인 staleness window)
idle(유휴상태)인 경우, FCM Backend
에서 token/topic mapping
을 삭제하려면, Firebase Admin SDK
를 사용해 topic subscription
을 취소해야한다.
이 2단계의 이점은 팬아웃할 오래된 token이 적기 때문에, 팬아웃이 더 빨리 발생하고, 오래된 앱 Instance
가 다시 활성화되면, 자동으로 다시 구독한다는 것이다.
Delivery Success 측정
일반적으로 적극적으로 사용되는 앱 Instance
에서 관찰하거나, 캡처한 작업을 기반으로 메시지를 타겟팅하는 것이 좋다.
구독자가 많은 topic
에 정기적으로 메시지를 보내는 경우 특히 중요하다.
이러한 구독자 중 일부가 실제로 inactive
상태인 경우, 시간에 따라 delivery statistics
에 미치는 영향은 상당하다.
메시지를 token
으로 targeting
하기전에 고려해야 할 점은 다음과 같다.
1. Google 애널리틱스, BigQuery에서 캡처한 데이터 또는 기타 추적 신호가 토큰이 활성 상태임을 나타내는가
2. 이전 delivery 시도가 일정 기간 동안 지속적으로 실패하였는지
3. 지난 2개월 동안 서버에서 registration token이 업데이트되었는지
4. Android
기기의 경우 FCM 데이터 API 는 droppedDeviceInactive
로 인해 높은 비율의 메시지 전달 실패를 보고하는지
'IT > Android' 카테고리의 다른 글
[Android/FCM] (5) Android에서의 알림 수신 구현 (0) | 2023.03.11 |
---|---|
[Android/FCM] (4) Android 설정 (0) | 2023.03.07 |
[Android/FCM] (2) 플랫폼 별 차이와 Delivery Options알림 (0) | 2023.03.01 |
[Android/FCM] (1) Firebase Cloud Messaging의 기초 개념및 구조 (0) | 2023.02.05 |
[Android/Retrofit] Effective Error Handling을 위한 CallAdapter의 활용 (0) | 2023.01.25 |