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

Firebaseを活用したPUSH通知基盤構築

y-danno
July 02, 2018

 Firebaseを活用したPUSH通知基盤構築

テレビ東京の見逃し動画配信サービス「ネットもテレ東」事業にて、Firebaseの各種機能を利用してPUSH通知基盤システムを構築した知見を紹介。

y-danno

July 02, 2018
Tweet

More Decks by y-danno

Other Decks in Technology

Transcript

  1. PROFILE -2007年  テレビ東京入社  情報システム局システム部 SE -2012年  技術局制作技術部 カメラマン -2015年  テレビ東京コミュニケーションズ

     動画配信サービスの技術・システム担当   ・WEB、アプリ   ・CMS   ・分析基盤(DHW、DMP)   ・PUSH通知基盤   ・ライブ配信   ・R&D 株式会社テレビ東京コミュニケーションズ 動画ビジネス部 テックリード 段野 祐一郎 [興味関心ワード] フロント : TypeScript, vue.js サーバー : Java, PHP(Laravel) DB : MySQL, Redshift, Treasure Data, BigQuery クラウド : AWS, GCP その他 : Firebase, Docker, redash, Talend, Tableau, 機械学習
  2. 背景 別のPUSH通知の仕組みを使うことを本格検討 - 2017 3Q - 【Firebase Notificationsでは満たせない要件】 柔軟な通知要件 例1)ドラマの新番組の告知通知を、ドラマ関心層に送りたい など

     →セグメントが多数必要だが、ユーザーリストの上限は50個... 例2)プッシュ通知を使った休眠ユーザーの掘り起こし施策  →休眠ユーザーの定義を、ユーザープロパティ・ユーザーリストでできない
  3. Firebase が 頑張る イメージ アプリ App Engine ①お気に入り番組登録 ③送信 ②抽出

    ④開封 ③送信 柔軟なセグメント作成は Analyticsとかのデータを分析し セグメント作って手動登録 ④開封
  4. お気に入り機能実装時につまづきそうな制約一覧 Firebase Notification ・topic配信 or FCM配信   (「レイテンシ」「送信結果」問題) ・送信APIいつの間にかLegacy(推奨APIで1件ずつ送信 or Legacy APIで一括送信)

    Firebase Analytics ・User Property(FCMトークンを保存できない) ・開封イベント (既存イベント名は使えない) Firestore ・インデックス (複合インデックスの運用問題) ・フィールドパス(key名に注意)
  5. お気に入り機能実装時につまづきそうな制約一覧 Firebase Notification ・topic配信 or FCM配信   (「レイテンシ」「送信結果」問題) topic配信は一件ごとの送信可否の内訳が取得できない。 遅延が大きい[レイテンシではなくスループットに対して最適化] → 送信対象はtopicではなく、FCMトークン宛てに送信するようにする

    ・送信APIいつの間にかLegacy(推奨APIで1件ずつ送信 or Legacy APIで一括送信) プロジェクト途中でAPIが、いつの間にかLegacyに(新API移行推奨)。 新APIは、複数宛先一括送信(registration_ids)がない! → いつまで使えるかわからないが、パフォーマンスを重視し、Legacyを使用
  6. お気に入り機能実装時につまづきそうな制約一覧 Firebase Analytics ・User Property(FCMトークンを保存できない) Firebase AnalyticsでUser PropertyとしてFCMトークンを出力できない (ユーザープロパティの上限は100文字まで[FCMトークンは150文字]) FCMトークンをどうやって保存するか

    → Firestoreに送信対象のFCMトークンを保存して、そこから取得する ・開封イベント (既存イベント名は使えない) 自動的に収集されるイベント notification_* は独自FCM実装では計測に使用できない → push_open などのカスタムイベントを作成
  7. お気に入り機能実装時につまづきそうな制約一覧 Firestore ・インデックス (複合インデックスの運用問題) お気に入り登録内容(どの番組)と通知許諾(登録状況)を管理したい →お気に入り番組名とその登録状況を別フィールドに分けると、新規番組追加時に  毎回複合インデックスを貼る必要が出てくる。煩雑でミス防止のため避けたい。 →番組フィールドに、以下(右図)のように持たす   登録 : タイムスタンプ(milli

    sec)   解除 : 0 ・フィールドパス(key名に注意) Firestoreには、お気に入り番組のID(godやchogokin-a)を登録していたが、   keyにハイフン(-)が入っている場合、プッシュ送信が失敗する →Firestoreの制約。バッククォートで回避 特定の1つのフィールドには 自動的にインデックスが張られる
  8. 結果 日次 累計 お気に入り番組登録数推移 お気に入り 登録数 日  ・PUSH通知開封率  ↗  ・PUSH通知運用負荷 ↘  ・Firebase

    Analyticsから抽出した特定のセグメントへのPUSH通知が可能  ・現在、自分の担当外の他VOD事業に実装中 PUSH基盤管理画面