Медленный пожарный вызов runTransaction - PullRequest
0 голосов
/ 09 ноября 2018

В настоящее время я пишу действие, которое как его часть проверяет и увеличивает значение orderID и отвечает им в разговоре.

Код в настоящее время работает, но часть выполнения может занять до 10 секунд, что может привести к тому, что действие на google timeout запрос и завершится неудачно (наряду с медленным, чтобы ответить пользователю, если вообще). Я использую runTransaction, чтобы убедиться, что никакой другой экземпляр функции на базе Firebase также не может увеличивать ID. Код всех функций и значение действительно увеличивается, но задержка в ответе функции означает намерение, на которое она отвечает, истекает время ожидания и дает ответ отката.

Как вы можете видеть в моем коде ниже, я добавил различные console.log для отслеживания задержки, между before transaction и transaction started при выводе на консоль задержка 8-10 секунд случается. Кто-нибудь может сказать почему?

const functions = require('firebase-functions');
const { dialogflow, Suggestions } = require('actions-on-google');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
const settings = {timestampsInSnapshots: true};
db.settings(settings);

const app = dialogflow();

app.intent('order', (conv, {givenname: givenname}) => {
  console.log('starting function');
  return new Promise(function(resolvei, rejecti){
    if(givenname !== undefined){

        console.log('before db.collection');

        var idRef = db.collection('orderIDs').doc('opho9peCy54tjLR0YmVm');
        console.log('before transaction');
        var transaction = db.runTransaction(t => {
          console.log('transaction started');
          return t.get(idRef)
            .then(doc => {
              console.log('data gotten');
              var id = doc.data().ID + 1;
              if(id > 99){
                id = 1;
              }
              t.update(idRef, {ID: id});
              console.log('update made');
              return Promise.resolve(id);
            });
        }).then(result => {
          console.log(result);
          conv.close('Thank you, ' + givenname + '. Your order number is ' + result + '.');
          resolvei();
        }).catch(err => {
          console.log('Transaction failure:', err);
          rejecti();
        });
      }
    else{
      conv.close('Oops, something has gone wrong, try again.');
      resolve();
    }
  });
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

1 Ответ

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

Я заметил, что при первом запуске развернутой функции runTransaction работает медленно и занимает около 4,5 секунд (даже если вы не выполняете работу в функции транзакции).После этого только runTransaction выполняется намного быстрее и занимает менее 200 мс.Это почти как в первый раз, когда вы запускаете вновь развернутую функцию, для функций с поддержкой транзакций происходит некоторое дополнительное облачное администрирование.

...