どっこと備忘録群

アウトプットしないとインプットできない私が Androidアプリ開発をメインとした備忘録を載せています。

DroidKaigi 2019 - FCM を使った用途に合わせた Push 通知設計 / Koji Okada [JA] を視聴した

視聴元

Pushを使おうとするときの要件はたくさん

  • 頻度
  • 送信対象ユーザの規模
  • 許容できる遅延
  • メッセージの内容
  • 開発体制
  • リリースタイミング

FirebaseCloudMessaging

  • 各プラットフォームにまとめて送信できる。便利。
  • ただしFCMだからといって、すべてを解決できる方法はない。

設計するときのよりどころ

制約を満たすように設計を考えると、選択肢がほとんどなくなる

  • FCMでできることは制約
  • 実現する機能の要件も制約

FCMでできることは?

通知対象をサーバで把握

  • サービスサーバが認識する手段
  • デバイストークン
  • トピックのサブスクライブ

通知送信のリクエスト

  • サービスサーバからFCMサーバへのPush通知を送る手段。
  • HTTP v1 API
  • レガシー HTTPサーバ
  • レガシー XMPPサーバ
  • FirebaseAdminSDK

通知データを処理して送信

  • 受け取った通知をユーザに表示する手段
  • 渡されたものをそのまま出す
  • アプリ側でハンドリングする

PixivのPush通知(ライブ開始通知)に関する事例

  • 通知対象をサーバで把握:トピックのサブスクライブ
    • DBでデバイストークンを管理したくない
    • 自分専用のトピックを生成してそれをサブスクライブさせる
  • 通知送信のリクエスト:レガシー XMPPサーバ
    • 既存基盤との兼ね合い
    • phpで実装されているためSDKを使えない
    • HTTP v1API以前に実装されたため レガシーのどちらか
      • できるだけ早くしたかったので XMPPサーバとした
  • 通知の送信
    • 通知に乗ったタイトル・本文

制約に関する整理

  • 頻度
    • 毎分数人程度を想定すると特になし
  • 送信ユーザ規模
    • 最大クラスユーザだと数十万件
    • 最大クラスのユーザに配信開始から15分程度で送信完了させたい
    • 許容できる通知の限度に制約がある
  • 送信メッセージ内容
    • これまでの同様の仕組みで問題なし
    • ただし未対応バージョンに影響あり。古いバージョンに対して問題が発生しないように送信する制約がある
  • リリース
    • 長くても3か月程度でリリースしたい

制約に対する設計

  • 通知の遅延限度
    • バッチの並列化(採用)
    • フォロワー向けトピックの用意(設計や改修規模に課題あり)
  • 古いバージョンに通知を送らない
    • アプリバージョンをサービスサーバで管理(改修規模に課題あり)
    • ログベースで送信対象をフィルタリング(採用)
  • リリース
    • 改修規模を加味して制約を整理

最終更新: 2025.6.16