检索不存在的文档时性能降低

时间:2018-09-28 15:53:27

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

我有一个Firebase函数,该函数获取Firebase身份验证令牌并创建一个文档来存储用户设置(如果我的Firestore集合中没有给定用户的文档)。

该函数可以正常工作,但是我注意到它大约需要十秒钟才能完成。

使用堆栈驱动程序日志记录和一些日志语句,我已经将其缩小到我认为是罪魁祸首的一行:

const userDoc = await admin.firestore().doc('users/' + uid).get();

对于上下文,我有一个过滤器,该过滤器对身份验证令牌进行解码并将其存储在请求变量中。请求端点本身看起来像这样:

app.post('/register', (async (req, res) => {
  console.log('New request to register user.');
  const uid = req['user'].uid;
  const userDoc = await admin.firestore().doc('users/' + uid).get();
  if (!userDoc.exists) {
    console.log('User does not exist. Creating.');
    // Do stuff here
  }
}));

我在stackdriver上获得的日志输出如下:

Stackdriver Log

如您所见,第一条和第二条日志语句之间大约有8秒的延迟。我在这里看到的唯一值得注意的事情是文档请求。在此之后,我还有其他多个呼叫firestore的电话,它们没有显示这种延迟。

关于这种行为,我有两种理论:

  • 由于这是我在此请求中对Firestore的首次调用(包括过滤器),因此Firestore可能需要首先进行初始化。就个人而言,看到高性能的Firestore在其他任何地方都是如此,我觉得这不太可能。

  • 其次,更有可能的是,出于技术原因,在不存在的文档上读取文档可能会花费一些时间?在这种情况下,将uid存储为文档的字段并在users集合上创建适当的查询会更好吗?

我当然对此可能完全错了,或者我忘记了一些东西。对此,我将不胜感激。

0 个答案:

没有答案