GYAOのtsです。
経緯
投稿がかなり久しぶりになってしまった。チームが変わったり、担当のプロダクトが変わったりで完全にチームも作り直し状態になってしまった。個人的にはチームをある程度固定してチームに対して仕事をアサインしたほうが効率的かつインクリメンタルなチームを作る上で効果的な気がする。評価もチームに対してなされる方がいいと思うのだが、そうなっていない現状がある。。。努力せねば。
そんなこんなで、現在はFirebase Realtime Database を主軸とし、モバイルアプリケーションのバックエンドを刷新しようとしている。
やりたいこと
- ユーザーに対するお知らせをメッセージとして格納していく。
- 全ユーザーに対するお知らせ、個別ユーザーに対するお知らせがある。
- メッセージの変更、削除ができる
- 個別ユーザーに対するお知らせは1回で500万程度のユーザーに対して。
これを実現するために迂余曲折(Firestore試したり、dataflow-pubsub試したり)あったが、
現状、以下の構成で行くことに決めた。
データ構造
/root/messagesの中にメッセージIDとメッセージ内容を格納。
isEveryoneがtrueであれば全員向け。(モバイルアプリで制御)
/root/usersの中にメッセージIDとboolean(既読・未読)を格納。
システム全体
- cloud storageにmessageディレクトリ、usersディレクトリを作成。
- 既存システムからjson linerをcloud storageにアップロードしてもらう(1ファイル1万行を500ファイル)
- CloudFunctionsのevent triggerでバケットを監視。uploadを検知
- cloud storageのpathがmessagesならmessagesに、usersならusersにupsert(マージ)する。
※messageは有効期限(expireDate)をunix timestampで持っているので、モバイルアプリの方で切れたメッセージは出さない処理を入れる。DB上は残ってしまうので、cleanExpiredMessageでdailyで削除。functionsはcron triggerが提供されていない。 他サービスつかってね なので、AzureのLogicAppsを使って、httpsで起動。
次回
DBのルールセットアップとupsertJsonを書きます。