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

时间:2018-03-09 16:33:27

标签: firebase express npm 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);

1 个答案:

答案 0 :(得分:1)

致词some of the comments:在撰写本文时,Cloud Firestore for Firebase仍然处于测试阶段

Firestore is in Beta

但是在这种情况下,Firestore可能不是罪魁祸首。云功能的冷启动时间很可能使您所拥有的任何数据库操作都黯然失色。

云函数需要时间来启动新实例

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

有一个section about Cloud Function performance提到了通过最小化模块依赖性可以带来的潜在收益。

  

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

     

如果函数导入模块,则这些模块的加载时间可以   在冷启动期间增加了调用延迟。你可以减少这个   延迟以及部署功能所需的时间   正确加载依赖项而不加载依赖项   功能不使用。

还可以查看令人敬畏的Cloud Performance Atlas video on the topic,其中提到了以下提示:

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

对于库依赖项,悬而未决的结果是摆脱可能实现自己和/或仅使用一个或几个函数但需要整个库的依赖项(我在看着你, lodash)。