Firebase云功能 - 查询Firestore时响应缓慢

Jam*_*ick 27 npm express firebase google-cloud-platform google-cloud-functions

我在Firebase中有一个简单的云功能,它在http POST中使用JSON并将其保存到Firestore集合中.它分配了512MB内存.

这个云功能的性能非常差.如果连续执行,往返行程从200-600ms变化,如果不经常执行(每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);
Run Code Online (Sandbox Code Playgroud)

Den*_*und 2

针对一些评论:在撰写本文时,Cloud Firestore for Firebase实际上仍处于测试阶段

Firestore 处于测试阶段

但 Firestore 可能不是本案的罪魁祸首。云功能的冷启动时间很可能会掩盖您所进行的任何数据库操作。

只要有时间,云函数就需要时间来启动新实例

  1. 部署新功能/首次调用
  2. 实例已被回收
  3. 扩展以处理负载(请求命中新实例)

有一个关于 Cloud Function 性能的部分提到了通过最小化模块依赖性可以获得的潜在收益。

由于函数是无状态的,因此执行环境通常从头开始初始化(在所谓的冷启动期间)。当发生冷启动时,将评估函数的全局上下文。

如果您的函数导入模块,这些模块的加载时间可能会增加冷启动期间的调用延迟。您可以通过正确加载依赖项而不加载函数不使用的依赖项来减少此延迟以及部署函数所需的时间。

另请查看有关该主题的精彩 Cloud Performance Atlas 视频,其中提到了以下提示:

  • 减少库依赖
  • 使用更(最)流行的包版本,因为它更有可能已被缓存
  • 延迟加载启动时不重要的模块

在库依赖的情况下,最容易实现的目标是摆脱依赖,这些依赖可以自己实现和/或仅使用一个或几个函数但需要整个库(我正在看着你,lodash)。