Облачные функции Firebase, вызывающие огромный всплеск Firestore Reads? - PullRequest
0 голосов
/ 12 апреля 2019

Я написал облачную функцию Firebase для получения данных из внешнего API и чтения / записи в Firestore. Я запускал функцию локально с помощью 'firebase serve' несколько раз. Затем я заметил, что за каждый час ~ 500 вызовов Firestore API были сделаны, даже когда функция не вызывается. И Firestore Writes and Deletes остается 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!');
});

Коллекция «авторы», «источники» и «статьи» содержит не более 20 документов каждый, так что должно быть что-то, что неоднократно вызывало Firestore, которое я не смог найти.

1 Ответ

0 голосов
/ 12 апреля 2019

Хотя это похоже на проблему ценообразования, я думаю, что это может быть проблема Повторная попытка облачных функций , кроме того, ваши номера использования не соответствуют коду, потому что у вас есть Методы установки и обновления Который сделал бы хотя бы одну запись. Возможно, вы захотите проверить, успешно ли выполняются ваши функции.

Если вы хотите понять стоимость Firestore, это может помочь.

Показания Firebase Firestore основаны на многих параметрах, таких как

  1. Количество запрошенных документов
  2. Обновления коллекции в реальном времени, если вы слушаете изменения
  3. Правила безопасности Firebase Firestore (каждый раз, когда ваши правила должны быть оценены)
  4. Количество запрошенных страниц, если используется нумерация страниц

Подробное объяснение можно найти здесь

и еще несколько примеров здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...