2020.02.01 PWA Night Conference https://conf2020.pwanight.jp
Firebase Cloud Messagingのベストプラクティスを、探している2020/02/01PWA Night Conference吉次 洋毅
View Slide
誰?● 吉次洋毅(ヨシツグヒロキ)● 経歴○ 某レストラン検索サイトでバックエンドエンジニアなど○ 某HR会社でエンジニアをしつつ○ フリーランスで受託開発&他社さんの開発やプロジェクトマネジメントのお手伝い● 趣味○ 一人旅 & 写真 & スーパー銭湯○ スマブラ(VIPボーダー周辺をウロウロ・ゼロサムユーザ)○ ポケモン(約20年ぶりにはじめました)@gyarasu
使ってる??
FCMによるWeb Pushが届くまで① FCMからトークンを取得④ プッシュ送信を受信②トークンをサーバに送信③ FCMに処理を投げる
FCMによるWeb Pushが届くまで① FCMからトークンを取得④ プッシュ送信を受信②トークンをサーバに送信③ FCMに処理を投げる送信方法がいくつかある
複数のデバイスに送信する方法は2つhttps://firebase.google.com/docs/cloud-messaging/js/send-multiple
よくみたら色々あったNode.js Admin SDKリファレンス:https://firebase.google.com/docs/reference/admin/node/admin.messaging
FCMでのPush送信方法いろいろ● CURL / send(Admin SDK)○ 単一のトークンを指定して送信● マルチキャスト(Admin SDK)○ 複数のトークンを指定し送信● トピックメッセージング○ 特定のトピックにオプトインした複数のデバイスにメッセージを送信● デバイスグループメッセージング○ 定義したグループに属する複数のデバイスにメッセージを送信
FCMによる送信方法Decision Tree(暫定)
FCMによる送信方法Decision Tree(暫定)やってみたけど、ちょっと苦労した
トピックメッセージングのハマりポイント● トピック購読管理の難しさ● ユーザ単位での送信状態の管理の難しさデバイスグループメッセージングのグループ管理も同様の課題あり
トピック管理の難しさ
トピックの購読状態の管理① FCMからトークンを取得④ プッシュ送信を受信②トークンをサーバに送信③ FCMに処理を投げる
トピックの購読・購読解除の流れtopic, tokenの組み合わせを保存・購読(subscribe)・購読解除(unsubscribe)・送信リクエストメッセージ配信(publish)FCM FaaSなど データベース
FCMとDBの状態の整合性topic, tokenの組み合わせを保存・購読リクエスト・購読解除リクエスト・送信リクエスト・購読(subscribe)・購読解除(unsubscribe)・メッセージ配信(publish)FCM FaaSなど データベース何らかの原因でデータが消失FCMから購読状態を取得することはできない
DB上のデータとFCM上での実際の購読状態の整合性が合わなくなる
DB上のデータとFCM上での実際の購読状態の整合性が合わなくなる・DB上では購読してないのにPushが届く・DBの上では購読状態なのにPushが届かない
DBのデータ更新とFCMの購読・非購読はAtomicな処理にする
ユーザ単位での送信状態の管理
通知設定の単位と細分化されたトピック営業事務技術設定 : 購読トピック = 1 : n
細分化トピックが引き起こす通知の嵐営業事務技術トピックメッセージングは、あくまでも「トピック」に対して通知を送る
設定とトピックが1 : 1になっていない場合ユーザにとって過多な通知になり得る
細かいセグメントで送信先を制御したい場合はマルチキャストでの送信が良さそう
Decision Tree途中経過ここはわかった!
トピックメッセージングの選択基準● 受信設定の単位とトピックが1:1になっている場合● トピックの単位が単純である場合○ 基本的にはコンテンツの単位が良い○ 年齢や性別のようなユーザ属性や、行動ログ等の要素を掛け算してトピック分割すると、条件が変動するたびに頻繁にトピックの購読・解除を行う必要があるのであまり向かない
まとめ● まずはサービスとしてのPush通知の要件・仕様をしっかり検討してからどの方法で送るか考える(最重要)● トピックメッセージングが向いているパターン○ 設定と購読トピックが1:1である場合○ 細分化されたトピックで送信しても問題ない場合● 細かい条件で送信対象を抽出したり、条件が頻繁に更新される場合はマルチキャストが良さそう○ トピックやデバイスグループ管理をしないで済む○ 1回の送信で500トークンという制限あり
※スキップしたスライドも含めてSpeaker Deckで公開します @gyarasuありがとうございました!