web-dev-qa-db-ja.com

FirebaseおよびExpressのクラウ​​ド機能

_functions.https_名前空間のFirebaseドキュメントは、関数が_express.Request_オブジェクトと_express.Response_オブジェクトを受け入れることを示しています。エクスプレスサーバーオブジェクトを_functions.https.onRequest_に渡すことができるとはどこにも言及されていません。ただし、これを行うべきではないというコメントを明確に示すことなく、これを行っていることがわかりました(_functions-samples_リポジトリ問題#101スレッドの1人を除く)

見る:

私の質問は次のとおりです。

  1. Firebase用クラウド関数またはGCPクラウド関数は、関数定義外で初期化されたオブジェクトのライフタイムをどのように処理しますか?
  2. 上記は関数の寿命にどのように影響しますか? AWS Lambdaと同様にタイムアウトまたは機能するまで実行されますか?

1および2の説明:Lambdaでは、エクスポートされた関数の外部のリソースは、その関数インスタンスが「ウォーム」である間、同じLambdaインスタンスの以降のすべての呼び出しで使用されます。つまり、関数の応答時間は、「ウォーム」インスタンスごとに1回実行されるため、複雑な初期化コードによって悪影響を受けることはありません。この例では、関数が「ウォーム」である間に一度だけ、呼び出しごとにExpressJSサーバーを初期化する必要はありません。 Cloud Functionsが同じことをしたいですか?

また、Lambdaでは、ExpressJSサーバーの存在は関数の実行時間を延長しません(関数が完了すると)、ここでCloud Functionsがどのように実装されるのか興味があります。それは単にLambdaと同じことを行いますか、それとも(既存のオブジェクトを異なる方法で処理する可能性があるため)他のことを行いますか?

  1. _functions.https.onRequest_のドキュメントでは、ExpressJSサーバーオブジェクトを渡すことができるとは明記されていませんが、これはどのように機能しますか?次に、2つのエンドポイントがありますか?誰かがここで何が起こっているのか説明できますか?

3の明確化:人々が次のことをしているのを見てきました。

_// './functions/index.js'

var functions = require("firebase-functions");
const express = require("express");

// setup ExpressJS Server
const expressRouter = new express.Router();
expressRouter.get("*", (req, res) => {
  res.send(`Hello from Express in Cloud Functions for Firebase`);
});

// Cloud Function
exports.express = functions.https.onRequest(expressRouter);_

また、Cloud Functions APIがExpressJS APIをモデルにしたfunctions.https.onRequest(request, response) paramsの受け入れのみを指定している場合、これがどのように機能するかを知りたいと思います。

これらのパラメーターは、Express RequestおよびResponseオブジェクト-firebase.google.com/docs/functions/http-eventsに基づいています

すべての質問は1つのコードスニペットとこの1つのユースケースに関係するので、一緒に答える方が良いと思いました。

前もって感謝します :)

22
jthegedus

これはすべて機能します。なぜなら、Expressアプリは、実際にはNode.js HTTPリクエストとレスポンスを受け取り、ルーティングなどの自動シュガーでそれらに作用する単なる機能であるためです。 Expressのreqおよびresオブジェクトは標準のNode.jsバージョンと互換性があるため、Expressルーターまたはアプリを問題なくCloud Functionハンドラーに渡すことができます。基本的に、あるアプリが別のアプリを呼び出している「ダブルエクスプレス」アプリです。

関数のライフサイクルと共有状態に関する限り、関数は、複数のリクエストを処理するためにmay存続するが、そうでないかもしれない一時的な計算インスタンスでスピンアップされます。 cannotある呼び出しから次の呼び出しまで同じ計算インスタンスで関数が呼び出されるかどうかを調整または保証します。

関数呼び出しの外部でリソース(Expressアプリなど)を作成でき、その関数の計算リソースがスピンアップされると実行されます。これは、インスタンスが存続する限り存続します。ただし、CPU /ネットワークは呼び出し間で実質的にゼロに調整されるため、関数呼び出しのライフサイクル以外では「作業」を行うことはできません。約束が解決したら(またはHTTPリクエストに応答したら)、コンピューティングリソースを調整して調整し、mayいつでも終了します。

26
Michael Bleigh

関数の有効期間を超えてリソースを保持することを期待すべきではありません。関数の最終的な約束が解決されるか、HTTP応答が完全に送信された後、コンテナが完全にクリーンアップされることを期待する必要があります。関数呼び出しの間に共有状態はありません。これは、Cloud Functionsがスケーリングできる唯一の方法です。共有状態が必要な場合は、それをデータベースに保存し、呼び出しごとに読み取り、必要に応じてトランザクションで保護します。

3番目の質問で何を尋ねているのかわかりません。それは、最初の2つの質問とは無関係のようです。たぶんそれはそれ自身の質問でしょうか?私の知る限り、バックエンドにはエンドポイントが1つしかありません。

4
Doug Stevenson