Firebase Cloud FunctiosのレスポンスはCDNにキャッシュできるらしい / #FJUG meetup 3
2018/04/02に開催された「Firebase Japan User Group / meetup / 3」に参加してきた。
ひと月ほど前にFJUGのSlackにジョインしたらいい感じに情報交換されていて、リアルイベントにも参加したくなった。
Slackで知って一番衝撃だったのは、Cloud Functionsでは「at-least-once」型のリトライになっていて、1回の関数呼び出しで普通に2回以上実行される場合もあること。
課金処理をCloud Functionsで行おうと思っていたので、IDを振って冪等性を担保しないといけないようだった。二重課金怖い。
Cloud FunctionsにCDN機能が付いてた
SPAでOGP, SEOをどうするか問題は長らく結論が出ていない。
SSRで根本的解決ができるのはわかっているが、プロジェクト初期からやるには重いタスクの割にリターンが少ない。
最近はNext.js, Nuxt.jsがあるので一昔よりは断然やりやすくなったが、SPAとかスタティックサイトの利点である「とりあえずS3に置いておけばOK!」ができなくなるのはツラい。
ってな訳でもう全ページ共通のOGPで我慢してる場合も多いと思うのだが @kame_f_no7 さんが発表していたCloud Functionsでの解決策が面白かった。
まとめるとリクエスト毎にMetaタグだけレンダリングしてあげましょう、って話なんだけど、それをサーバーレスのCloud Functionsでやることで追加のSaaS契約とかサーバー管理とかも必要なくなると。
Metaタグだけのレンダリングなので、レンダリングコストも少なく、ロジックも簡単にできるので、運用としても実装としてもそんなに重くない。
しかもFirebase使うなら、OGPに表示したい内容はだいたいRealtime DatabaseかFirestoreに入っているはずなので、そこから取得するなら面倒なクレデンシャルの管理も必要ない。
ここまでは自分もCloud FunctionsでNext.jsを動かそうと思った時に検討していたけれど、結局レスポンスが遅すぎるので、別CDNでキャッシュさせる必要があり本末転倒だと思って諦めた。
知見だったのが、Cloud FunctionsのレスポンスをCloud HostingのCDNにキャッシュさせられること。
Cloud HostingのCDNキャッシュはスタティックファイルだけだと思っていたので半信半疑だったが、懇親会で聞いてみると公式ドキュメントにも記載されているとのことだった。
関数はコンテンツを動的に生成するため、関数によって処理されるリクエストは、デフォルトで CDN にキャッシュされません。アプリのスピードアップと関数の実行コストの削減のために、キャッシュの動作を自分で設定することができます。
あった。Varyとかまで設定できて、裏側で使われているらしいFastlyの代わりにできそう。
Cloud FunctionsをFirebaseだけでキャッシュできるとなると色々夢が広がる。
Realtime Databaseの障害どうするか問題
@brn227 さんがされていたFirebaseのツラみの話も印象的だった。
Realtime Databaseで時々よくわからん障害起こる問題は自分も経験したことがあって、REST APIでQueryする際に同じ条件なのにレスポンスが異常に遅いときがたまにあった。
Realtime Databaseへのバッチ処理を行うためにBigTableへダブルWriteを行っているそう。
ただ、登壇時に口頭で説明されていたが、「リクエストがTimeoutする問題」が発生した際にBigtableにだけ記録されてしまい、Realtime DatabaseとBigtableの間のデータ不整合が起き、堂々巡りになってしまうらしい。
クライアントサイドでのダブルWriteはアンチパターンのはずなのでCloud Functionsで対応するといいのではないかと思った。
具体的には、Realtime Databaseへの書き込み .onWrite()
をトリガーにしてBigtableへ書き込む機能を持ったCloud Functionsを起動すればいい。
Cloud Functionsもそこそこ障害が起こっているが、一応リトライ機構がついているので、そこの範囲で頑張ってもらえると信じたい。。
全体としては、UnityとかDart(Flutter)の話もあって、自分はWebでしかFirebaseを使ったことがなかったけれど、メインユースケースはやっぱりネイティブアプリなんだな(mBaaSって言うぐらいだし)と思った。
懇親会ではおにぎりが出たのだけれど、めっちゃ美味しかった!
ありがとうございます!