【问题标题】:Slow firestore runTransaction call缓慢的 firestore runTransaction 调用
【发布时间】:2019-04-12 14:29:04
【问题描述】:

我目前正在编写一个作为其中一部分的操作,它检查并增加一个 orderID 值并在对话中用它来响应。

代码当前有效,但部分执行可能需要长达 10 秒的时间才能执行,这可能会使 action-on-google 超时请求并失败(如果有的话,回复用户的速度也会很慢)。我使用runTransaction 来确保firebase 上没有其他函数实例也可以增加ID。代码中的所有函数和值都会增加,但函数响应的延迟意味着它响应的意图超时并给出回退响应。

正如您在下面的代码中看到的那样,我添加了各种console.log 来跟踪延迟,在输出到控制台的before transactiontransaction 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);

【问题讨论】:

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


    【解决方案1】:

    我注意到,当您第一次运行已部署的函数时,runTransaction 很慢,大约需要 4.5 秒才能完成(即使您没有在事务函数中做任何工作)。之后,单独的 runTransaction 要快得多,并且需要

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 2020-07-15
      • 1970-01-01
      • 2019-08-07
      • 2018-04-19
      • 2010-09-27
      • 2023-03-27
      • 2018-11-15
      • 2019-09-09
      相关资源
      最近更新 更多