我们在 Firestore 上运行一个应用程序并得到一个简单的触发器,当订单的详细信息被创建或更新时,它的一些信息应该在父订单集合中重写。
这个函数有以下代码
export const updateOrderDetails = functions
.region(FUNCTION_REGION)
.firestore.document("orders/{orderId}/details/pickupAndDropoff")
.onWrite(async (change, context) => {
return await admin
.firestore()
.collection("orders")
.doc(context.params.orderId)
.set({ pickupAndDropoff: change.after.data() }, { merge: true });
});
它以前工作得很好,但现在随机大约有三分之一的执行被延迟。有时几分钟。在 Cloud Function 日志中,我们看到正常执行时间 <200 毫秒,因此触发器似乎在巨大的停顿后运行。更糟糕的是我们的
change.after.data()
是未定义的,但我们从不删除任何东西——它只是更新和创建。它工作正常,自上周以来我们没有改变任何东西,但现在它开始出现这种意想不到的延迟。我们还检查了 firebase 状态,但 firebase 功能服务没有故障。这可能是什么原因?
最佳答案
问题可能是由于单调递增的 订单号 作为此处传递的参数:
...
.collection("orders")
.doc(context.params.orderId)
...
如果您可以检查一次 订单号 通过这里是随着每个请求单调增加?它可以导致热点 影响延迟 .解释一下,我认为写入速率必须在不同的日期和时间发生变化——随着使用应用程序的用户流量或负载测试请求发生变化——这会产生意想不到的行为。在 低写入率 ,请求大部分时间都按预期工作。在 高写入率 ,请求在firestore中面临热点情况,如firestore文档中所述,导致延迟(延迟问题)。
Here是 Firestore 最佳实践文档的相关链接。
关于javascript - Firestore 突然出现巨大的触发延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68850609/