首页 > 解决方案 > Firebase 在函数执行中的极端延迟

问题描述

已经实现了一个firebase云函数,每次价格值变化时触发,代码如下:

export const orderListener = functions.firestore
  .document("/users/{userId}/Order/{orderId}")
  .onUpdate(async (change, context) => {
    const { userId, orderId } = context.params;
    const price = change.after.data().price;
    try {
      if (price !== 0) {
        const userDoc = await admin
          .firestore()
          .collection(`/users/${userId}/Personal information`)
          .doc("Personal Information")
          .get();
        const { fcmToken } = userDoc.data()!;

        functions.logger.log({
          userId,
          fcmToken,
          orderId,
          price,
        });
        //RETURN
        return admin.messaging().sendToDevice(fcmToken, {
          notification: {
            title: "Title of the message",
            body: `${orderId}'s price > 0`,
          },
        });
      } else {
        return null
      }
    } catch (e) {
      functions.logger.error(e.message);
      //RETURN
      return null

此代码已部署在 firebase 函数中,我尝试通过更改 price 的值来测试它,并通过查看 firebase 控制台来监控执行情况。

期待:

一旦我更改了我的 firestore 数据库中的 price 值,它几乎立即执行(在 5 秒内)。

结果:

该函数执行得很好并已记录在 Firebase 控制台上,但在我更新价格值后执行延迟 50 分钟(函数执行仅在 50 分钟后记录)。它由其他人测试,但似乎没有这个问题。

问题:

此代码中包含任何潜在错误吗?firebase 设置、设置等是否可能有一些错误...?

标签: firebasegoogle-cloud-functions

解决方案


你应该在这里考虑两件事:

1 - 冷启动功能。如果某个功能正在更新或有一段时间未使用,它将有点“关闭”或“进入睡眠状态”。当它再次被触发时,它会有一个需要一段时间的“冷启动”。它有点从“睡眠”中启动功能

2 - 日志不是实时的。日志不会实时显示。如果您在 Firebase 控制台或 GCP 控制台上观看它们,它们也有一些滞后和依赖,您可能需要手动刷新它们。

50 分钟对于云功能来说已经足够了。我相信您可能只是没有按照您的预期看到日志。也可能是您测试设备在尝试时处于脱机状态,并且稍后同步。如果没有有关您的代码、设备以及您如何测试它的更多信息,我们很难判断它到底是什么,但提到的场景是最有可能的。


推荐阅读