Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Firebase Cloud Messaging のベストプラクティス を、探している

gyarasu
February 01, 2020

Firebase Cloud Messaging のベストプラクティス を、探している

2020.02.01 PWA Night Conference
https://conf2020.pwanight.jp

gyarasu

February 01, 2020
Tweet

More Decks by gyarasu

Other Decks in Technology

Transcript

  1. Firebase Cloud Messaging
    のベストプラクティス
    を、探している
    2020/02/01
    PWA Night Conference
    吉次 洋毅

    View full-size slide

  2. 誰?
    ● 吉次洋毅(ヨシツグヒロキ)
    ● 経歴
    ○ 某レストラン検索サイトでバックエンドエンジニアなど
    ○ 某HR会社でエンジニアをしつつ
    ○ フリーランスで受託開発&他社さんの開発やプロジェクトマネジメントのお手伝い
    ● 趣味
    ○ 一人旅 & 写真 & スーパー銭湯
    ○ スマブラ(VIPボーダー周辺をウロウロ・ゼロサムユーザ)
    ○ ポケモン(約20年ぶりにはじめました)
    @gyarasu

    View full-size slide

  3. 使ってる??

    View full-size slide

  4. FCMによるWeb Pushが届くまで
    ① FCMからトークンを取得
    ④ プッシュ送信を受信
    ②トークンをサーバに送信
    ③ FCMに処理を投げる

    View full-size slide

  5. FCMによるWeb Pushが届くまで
    ① FCMからトークンを取得
    ④ プッシュ送信を受信
    ②トークンをサーバに送信
    ③ FCMに処理を投げる
    送信方法がいくつかある

    View full-size slide

  6. 複数のデバイスに送信する方法は2つ
    https://firebase.google.com/docs/cloud-messaging/js/send-multiple

    View full-size slide

  7. よくみたら色々あった
    Node.js Admin SDKリファレンス:
    https://firebase.google.com/docs/reference/admin/node/admin.messaging

    View full-size slide

  8. FCMでのPush送信方法いろいろ
    ● CURL / send(Admin SDK)
    ○ 単一のトークンを指定して送信
    ● マルチキャスト(Admin SDK)
    ○ 複数のトークンを指定し送信
    ● トピックメッセージング
    ○ 特定のトピックにオプトインした複数のデバイスにメッセージを送信
    ● デバイスグループメッセージング
    ○ 定義したグループに属する複数のデバイスにメッセージを送信

    View full-size slide

  9. FCMによる送信方法Decision Tree(暫定)

    View full-size slide

  10. FCMによる送信方法Decision Tree(暫定)
    やってみたけど、
    ちょっと苦労した

    View full-size slide

  11. トピックメッセージングのハマりポイント
    ● トピック購読管理の難しさ
    ● ユーザ単位での送信状態の管理の難しさ
    デバイスグループメッセージングのグ
    ループ管理も同様の課題あり

    View full-size slide

  12. トピックメッセージングのハマりポイント
    ● トピック購読管理の難しさ
    ● ユーザ単位での送信状態の管理の難しさ
    デバイスグループメッセージングのグ
    ループ管理も同様の課題あり

    View full-size slide

  13. トピック管理の難しさ

    View full-size slide

  14. トピックの購読状態の管理
    ① FCMからトークンを取得
    ④ プッシュ送信を受信
    ②トークンをサーバに送信
    ③ FCMに処理を投げる

    View full-size slide

  15. トピックの購読・購読解除の流れ
    topic, tokenの
    組み合わせを保存
    ・購読(subscribe)
    ・購読解除(unsubscribe)
    ・送信リクエスト
    メッセージ配信(publish)
    FCM FaaSなど データベース

    View full-size slide

  16. FCMとDBの状態の整合性
    topic, tokenの
    組み合わせを保存
    ・購読リクエスト
    ・購読解除リクエスト
    ・送信リクエスト
    ・購読(subscribe)
    ・購読解除(unsubscribe)
    ・メッセージ配信(publish)
    FCM FaaSなど データベース
    何らかの原因で
    データが消失
    FCMから購読状態を取得す
    ることはできない

    View full-size slide

  17. DB上のデータとFCM上での実際の
    購読状態の整合性が合わなくなる

    View full-size slide

  18. DB上のデータとFCM上での実際の
    購読状態の整合性が合わなくなる

    ・DB上では購読してないのに
    Pushが届く
    ・DBの上では購読状態なの
    にPushが届かない

    View full-size slide

  19. DBのデータ更新とFCMの購読・非購読は
    Atomicな処理にする

    View full-size slide

  20. ユーザ単位での
    送信状態の管理

    View full-size slide

  21. 通知設定の単位と細分化されたトピック
    営業
    事務
    技術
    設定 : 購読トピック = 1 : n

    View full-size slide

  22. 細分化トピックが引き起こす通知の嵐
    営業
    事務
    技術
    トピックメッセージングは、あく
    までも「トピック」に対して通知
    を送る

    View full-size slide

  23. 設定とトピックが1 : 1になっていない場合
    ユーザにとって過多な通知になり得る

    View full-size slide

  24. 細かいセグメントで
    送信先を制御したい場合は
    マルチキャストでの送信が良さそう

    View full-size slide

  25. Decision Tree途中経過
    ここはわかった!

    View full-size slide

  26. トピックメッセージングの選択基準
    ● 受信設定の単位とトピックが1:1になっている場合
    ● トピックの単位が単純である場合
    ○ 基本的にはコンテンツの単位が良い
    ○ 年齢や性別のようなユーザ属性や、行動ログ等の要素を掛け算してトピック分
    割すると、条件が変動するたびに頻繁にトピックの購読・解除を行う必要があ
    るのであまり向かない

    View full-size slide

  27. まとめ
    ● まずはサービスとしてのPush通知の要件・仕様をしっかり検
    討してからどの方法で送るか考える(最重要)
    ● トピックメッセージングが向いているパターン
    ○ 設定と購読トピックが1:1である場合
    ○ 細分化されたトピックで送信しても問題ない場合
    ● 細かい条件で送信対象を抽出したり、条件が頻繁に更新され
    る場合はマルチキャストが良さそう
    ○ トピックやデバイスグループ管理をしないで済む
    ○ 1回の送信で500トークンという制限あり

    View full-size slide

  28. ※スキップしたスライドも含めてSpeaker Deckで公開します
     @gyarasu
    ありがとうございました!

    View full-size slide