🤖

Cloud Functions for Firebaseは遅い?その2

2023/12/17に公開

前回の記事で調査したように、Firebase Functionsからfirebase-adminを使ってFirebaseの他サービス(FirestoreやAuthentication)を呼び出す場合、コールドスタート時にgRPCの初期化が走りその処理にかなり時間がかかかる問題があります。特に対策をしていないFunctionsの関数を使うと、この条件のときにFunctionsの応答に4秒くらいかかるケースが有りました。

この問題は2020年ころには課題として認識されていましたが、長い間対策方法はない状況でした。この問題について議論しているチケット ではgRPCではなくREST APIを使って他サービスを呼び出す方法が回避策として提案されていました。2022年にこの方法が正式な対策として取り込まれれたようです。

firebase-adminのdocumentを見ると、この対策を有効にするには、Firestoreの初期化時にpreferRestをoptionとして渡す必要があります。

Firestoreの初期化の説明部分に、特に説明はなくシレっとoptionとして追加されていました。

firebase-adminのRelease notesを見ると、version 11.4.0でこの対策が入ったようです。これより古いバージョンを使っている場合は、最新にupdateしてこのoptionを有効にすると幸せになれそうです。

改めてpreferRestの説明を見ると

FirestoreSettings.preferRest

可能な場合は HTTP/1.1 REST トランスポートを使用します。
preferRest 、gRPC を必要とするメソッドが呼び出されるまで、HTTP/1.1 REST トランスポートの使用を強制します。メソッドで gRPC が必要な場合、この Firestore クライアントは依存する gRPC ライブラリをロードし、それ以降のすべての通信に gRPC トランスポートを使用します。現在、gRPC を必要とする唯一の操作は、 onSnapshot()を使用してスナップショット リスナーを作成することです。

とあります。FunctionsでonSnapshotを使うことは少ないと思うので、このoptionを使うことで問題は解決と言えそうです。

シンギュラリティ・ソサエティ

Discussion