web-dev-qa-db-ja.com

Firebase Cloud Functions-Firestoreへのクエリ時の応答が遅い

JSONをhttp POSTで取得し、Firestoreコレクションに保存する単純なCloud FunctionがFirebaseにあります。512MBのメモリが割り当てられています。

このクラウド機能のパフォーマンスは非常に貧弱です。継続的に実行される場合、往復は200〜600ミリ秒で変化し、頻繁に実行されない場合(5〜10分ごと)、4〜10秒かかることがあります。コールドスタートの問題は理解していますが、AWSでコールドスタートがこれほど遅く、頻繁に発生することはありません。

私のコードは以下です-パフォーマンスをスピードアップする方法についての洞察をいただければ幸いです。

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();

const express = require('express');
const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// CORS Express middleware to enable CORS Requests.
const cors = require('cors');
app.use(cors({ Origin: true }))

app.post('/submitResponse', (req, res) => {
  console.log('/submitResponse');

  if (!req.body.info)
    res.status(422).send()

  const payload = req.body.info;
  console.log(payload);

  const responses = db.collection("responses")

  responses.add({
    payload: payload,
    timestamp: admin.firestore.FieldValue.serverTimestamp()
  }).then(function(docRef) {
    console.log("Response written with ID: ", docRef.id);
    res.status(200).send(JSON.stringify(docRef.id))
  })
  .catch(function(error) {
      console.error("Error adding document: ", error);
  });
});

exports.app = functions.https.onRequest(app);
29
James Beswick

対処するには コメントの一部 :執筆時点 Cloud Firestore for Firebase は実際にはまだベータ版です

Firestore is in Beta

しかし、この場合はおそらくFirestoreが原因ではありません。クラウド機能のコールドブート時間は、ほとんどの場合、実行中のすべてのデータベース操作を覆います。

クラウド関数は、いつでも新しいインスタンスを起動するために時間が必要です

  1. デプロイされた新しい関数/最初の呼び出し
  2. インスタンスがリサイクルされました
  3. 負荷を処理するためのスケールアップ(新しいインスタンスにヒットするリクエスト)

モジュールの依存関係を最小限に抑えることで得られる潜在的な利益について言及する Cloud Functionのパフォーマンスに関するセクション があります。

関数はステートレスであるため、実行環境は多くの場合、最初から初期化されます(コールドスタートと呼ばれる処理中)。コールドスタートが発生すると、関数のグローバルコンテキストが評価されます。

関数がモジュールをインポートする場合、それらのモジュールのロード時間がコールドスタート中の呼び出しレイテンシに追加される可能性があります。依存関係を正しく読み込み、関数が使用しない依存関係を読み込まないことで、このレイテンシと関数のデプロイに必要な時間を短縮できます。

また、すばらしい トピックに関するCloud Performance Atlasビデオ も確認してください。

  • ライブラリの依存関係を減らす
  • 既にキャッシュされている可能性が高いため、パッケージのより多くの(最も人気のある)バージョンを使用する
  • 起動時に重要ではないモジュールの遅延読み込み

ライブラリの依存関係の場合、最低限の懸案事項は、自分で実装できるか、1つまたはいくつかの関数のみを使用しているが、ライブラリ全体を必要とする依存関係を取り除くことです(私はあなたを見ています、lodash)。

1
Dennis Alund