【问题标题】:Firebase Cloud Functions causing a huge spike in Firestore Reads?Firebase 云函数导致 Firestore 读取量激增?
【发布时间】:2019-09-02 21:15:52
【问题描述】:

我编写了一个 Firebase 云函数来从外部 api 获取数据并读/写到 Firestore。我用“firebase serve”在本地运行了几次该功能。然后我注意到每小时进行了约 500 次 Firestore API 调用,即使没有调用该函数也是如此。并且 Firestore 写入和删除保持为 0,只有读取增加。

只有在我关闭计算机时才会停止读取峰值,因此我相信云功能是原因。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const axios = require('axios');

admin.initializeApp();

exports.someFunc = functions.https.onRequest((request, response) => {
  const url = 'https://someurl.com';

  const getData = async url => {
    try {
      const response = await axios.get(url);
      const data = response.data;
      if (data.status === 'ok') {
        data.articles.forEach(element => {
          if (element.author) {
            element.author = element.author.replace(/\//g, ',');

            var authorRef = admin
              .firestore()
              .collection('authors')
              .doc(element.author);

            authorRef
              .get()
              .then(doc => {
                if (!doc.exists) {
                  authorRef.set({
                    sources: [element.source.name]
                  });
                } else {
                  var sources = doc.data().sources;
                  if (!sources.includes(element.source.name)) {
                    sources.push(element.source.name);
                    authorRef.update({
                      sources: sources
                    });
                  }
                }
                return null;
              })
              .catch(error => {
                console.log('Error getting document:', error);
              });
          }

          if (element.source.name) {
            element.source.name = element.source.name.replace(/\//g, ',');

            var sourceRef = admin
              .firestore()
              .collection('sources')
              .doc(element.source.name);

            sourceRef
              .get()
              .then(doc => {
                if (!doc.exists) {
                  var sourceUrl = 'https://' + element.url.split('/')[2];
                  sourceRef.set({
                    sourceUrl: sourceUrl
                  });
                }
                return null;
              })
              .catch(error => {
                console.log('Error getting document:', error);
              });
          }

          admin
            .firestore()
            .collection('articles')
            .add(element);
        });
      }
    } catch (error) {
      console.log(error);
    }
  };

  getData(url);
  response.send('Success!');
});

'authors'、'sources' 和 'articles' 集合每个最多只有 20 个文档,所以肯定有一些重复调用 Firestore 的东西我找不到。

【问题讨论】:

  • 您是否也有带 Db 触发器的云功能?能否发布您的云功能使用详情
  • @MahiTejGvp 不,这是我唯一的功能。以下是详细信息imgur.com/a/9vC8oQP
  • 您能否也发布您的云功能使用情况统计信息
  • 它准确显示了我调用它的次数。由于我部署了该功能,它只显示 1.

标签: firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

虽然这看起来像是定价问题,但我认为这可能是 Cloud Functions Retries 的问题,而且您的使用次数与代码不匹配,因为您有 设置和更新方法,这至少可以一写。您可能想检查您的函数是否成功执行。

如果您想了解 Firestore 定价,这可能会有所帮助。

Firebase Firestore 读取基于许多参数,例如

  1. 请求的文件数量
  2. 如果您正在收听更改,则实时更新集合
  3. Firebase Firestore 安全规则(每次必须评估您的规则时)
  4. 使用分页时请求的页数

你可以找到详细的解释here

还有几个例子here

【讨论】:

  • 我的函数在我调用它时正确执行,显示了正确的写入次数,但读取次数大大增加。
  • 你说delete和writes是0,reads是500?你的安全规则是什么?他们是否限制了函数中集合的任何读写
  • 我尝试只在安全规则中允许写入,但读取仍然增加,所以我认为安全规则不适用于云功能。 stackoverflow.com/a/53727783/10855587
猜你喜欢
  • 2021-02-16
  • 2019-02-26
  • 2021-04-03
  • 1970-01-01
  • 2018-06-30
  • 2017-08-12
  • 2018-05-29
  • 2019-08-22
  • 2019-08-28
相关资源
最近更新 更多