【问题标题】:Firebase Cloud Functions - slow response when querying FirestoreFirebase Cloud Functions - 查询 Firestore 时响应缓慢
【发布时间】:2018-08-18 06:54:29
【问题描述】:

我在 Firebase 中有一个简单的云函数,它在 http POST 中获取 JSON 并将其保存到 Firestore 集合中。它分配了 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);

【问题讨论】:

  • 请记住,Cloud Functions 和 Cloud Firestore 都处于测试阶段,不提供性能保证。我敢肯定,如果您将性能与实时数据库进行比较,您会看到更好的数字。
  • 感谢道格的回复。所以:(1)可以说这是测试版的正常表现吗? (2) 我正在做的事情是否导致它异常缓慢? (3) 是否可能影响冷启动?
  • @Doug Stevenson Firestore 已经过测试版,他们对此进行了改进吗?
  • 我制作了一个小游戏,它使用云功能对用户数据进行转换,但周转时间很短。它从我的游戏中带走了“实时”方面。
  • 你的考试已经过去九个月了。我想知道您是否可以重新运行一些代码并查看是否有冷启动问题?感谢您的文章。

标签: firebase express npm google-cloud-platform google-cloud-functions


【解决方案1】:

some of the comments:在撰写本文时Cloud Firestore for Firebase实际上仍处于测试阶段

但在这种情况下,Firestore 可能不是罪魁祸首。云功能的冷启动时间很可能会掩盖您正在进行的任何数据库操作。

云功能需要时间来启动新实例

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

section about Cloud Function performance 提到了通过最小化模块依赖关系可以获得的潜在收益。

因为函数是无状态的,所以执行环境往往是 从头开始初始化(在所谓的冷启动期间)。什么时候 发生冷启动时,评估函数的全局上下文。

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

还可以查看很棒的Cloud Performance Atlas video on the topic,其中提到了以下提示:

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

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

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 2020-10-22
    • 1970-01-01
    • 2021-11-18
    • 2019-02-04
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多