针对Firebase的Async / Await Cloud功能,性能降低

时间:2017-06-07 06:41:52

标签: javascript firebase async-await google-cloud-functions

我需要一些帮助和支持来解决Firebase的云功能中的性能问题。我将async / await与try / catch块结合使用,使我的代码更具可读性。

我有一个简单的函数,它根据队列写入事件中的params键值写入数据库中的两个位置。

这个简单的功能平均需要1500毫秒才能完成。对于简单的数据库任务写入,我认为似乎有点长。我认为我在代码中犯了一个错误,并且部分代码无法正确解析。

云功能

export const watchRegisterJobs = functions.database.ref(`queues/register/{$key}`).onWrite(
  async (event: Event<any>) => {
    if (!event.data.exists()) {
      return;
    }
    if (event.data.exists()) {
      const formData = event.data.val();
      let key;
      event.params&&(key=event.params.$key);

      if (key) {
        console.log('New user with the following id', key)
        try {
          await addUser(formData, key)
        } catch (error) {
          console.log('can not add user to database', error)
        }
        try {
          await addOrganization(formData, key)
        } catch (error) {
          console.log('can not add organization to database', error)
        }
        try {
         await event.data.ref.remove();
        } catch (error) {
          console.log('can not remove job')
        }
        return;
      }
    }
  }
)

帮助程序功能

export const addUser = async (data, key) => {

  const dataToSave = {
    information: ....,
    organizations: .....
  };

  try {
    return await admin.database().ref(`users/${key}`).set(dataToSave);
  } catch (error) {
    return error;
  }
}

export const addOrganization = async (data, key) => {
  const organization = {
    ...
  }
  try {
    return await admin.database().ref(`organizations/${key}`).set(organization);
  } catch (error) {
    return error;
  }
}

更新 根据评论,我对代码做了一些改进。性能仍然相同,但代码看起来更好。

云功能

export const watchRegisterJobs = functions.database.ref(`queues/register/{$key}`).onWrite(
  async (event: Event<any>) => {
    if (!event.data.exists()) {
      return;
    }

    const formData = event.data.val();
    let key;
    if(event.params) {
      key = event.params.$key;
    }

    if (key) {
      console.log('New user with the following id', key)
      try {
        await addUser(formData, key)
        await addOrganization(formData, key)
        await event.data.ref.remove();
      } catch (error) {
        console.log('can not write to the database', error)
      }
      return;
    }
  }
) 

助手

export const addUser = (data, key) => {

  const dataToSave = {
    information: ....,
    organizations: ....
  };

  return admin.database().ref(`users/${key}`).set(dataToSave);
}

export const addOrganization = (data, key) => {
  const organization = {
    ...
  }

  return admin.database().ref(`organizations/${key}`).set(organization);
}

1 个答案:

答案 0 :(得分:1)

看到你的代码看起来没问题(我没有看到任何不返回的代码路径),我只是用异步等待我自己的测试,这是我的结果:

  1. 执行(代码更新和部署后):1058ms
  2. 执行:120ms
  3. 执行:38ms
  4. 我怀疑你的功能已经冷却了。在代码更新后第一次执行函数时,Firebase需要设置环境,这在第一次需要一段时间。当函数暂时没有使用时也会发生同样的情况。

    其中一位开发者提供了更多信息:Firebase cloud functions is very slow

    编辑:忘记提及我使用的是打字稿。这意味着我的代码显然会被转换,因为Firebase本身并不支持async / await。我怀疑你在做类似的事情。还注意到你的最后一个val formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ") println(formatter.print(dt)) 应该向下移动一级(如果key为null)。