FCM Batch send API の v1 API への移行方法

以前書いたブログで、バッチ送信と呼ばれるFCMへの単一のHTTPリクエストに複数の送信リクエストを含めることができるAPIが廃止される件について書きました。 fxwx23.hatenablog.com

この件がなんとか決着をつけられそうなので、どう対応していくかについてまとめます。

Legacy API を引き続き使えるように要請する(Optional)

前提として該当の API は6月20日以降に動作しなくなると言われていました。終了日2日前に "[Reminder] Update your apps to the latest Firebase Cloud Messaging APIs and SDKs" というメールが届いていて、そこにはサービスに影響させたくない場合は延長リクエストを送る事ができますよと書いてあったので、さっそく Firebase Support に連絡します。

サポートの返事には、沢山リクエストがあったのでひとまず7月20日まで伸ばしましたという報告と、さらに延長したい場合はGoogleフォームに必要項目を記載して提出してねと言われました。フォームには最長9月末まで延長できそうな感じだったので9月末を選択、延長理由は公式SDKがHTTP2にまだ対応してないからと記載しました。提出から数日後に延長許可のメールが届いたので無事に受理されたようでした。

ひとまず引き伸ばしたいという方はまず Firebase の Support に連絡してみると良さそうです。

公式SDKを HTTP/2 対応ver に更新する

前回のブログでも対応方針として HTTP/2 対応するしかないと紹介しましたが、公式の Firebase Admin SDK 側でも対応が進みつつあります。 7月30日時点ではまだ NodeJS SDK しか対応されていません。 Go や Java のほうでは issue はありますが、PR などはまだ出てきていない状況です。

実際に対応された NodeJS SDKv12.3.0 に移行してみます。

- "firebase-admin": "12.2.0"
+ "firebase-admin": "12.3.0" 

やることとしては、 sendAllsendMulticastsendEachsendEachForMulticast に入れ替えるだけです。 12.3.0 では基本的に HTTP/2 のクライアントを利用してくれるようなので特別な設定は不要のようです。

実装は feat(fcm): Add HTTP2 support for `sendEach()` and `sendEachForMulticast()` by jonathanedey · Pull Request #2550 · firebase/firebase-admin-node · GitHub で確認することができます。いい感じにリトライ処理もしてくれるし、Token の最大数も 500 のままで大丈夫そうなので安心です。

ただ基本的にすべての送信で HTTP/2 が採用されてしまうことには注意が必要です。12.3.0 に更新して一部条件では延長期限まで sendMulticast を使い、その他では sendEachForMulticast に移行するというケースを例にします。

const messaging = getMessaging(app);

let response: BatchResponse;
const useHttpV1API = true; // 任意の条件
if (useHttpV1API) {
  response = await messaging.sendEachForMulticast(message);
} else {
  response = await messaging.sendMulticast(message);
}

Node.js の Admin SDKsendEachsendEachForMulticast では基本的に HTTP/2 のクライアントが利用されます。場合によって引き続き HTTP/1.1 のクライアントを使いたいケースがあるかもしれません。 その場合は送信処理を実行する前に enableLegacyTransport() メソッドで切り替えることができます。

気になるのはパフォーマンスですが、Legacy API と比較する必要があるのでそれはまた別途やってみて共有できそうならまたブログを書きたいと思います。