我有一个 firebase 函数,如下所示:
export const syncDataScheduled = onSchedule({
schedule: "every 1 minutes",
timeoutSeconds: 70, //we don't want the function to run for longer than 1 minute (will give it some extra time for cleanup)
maxInstances: 5,
timeZone: 'America/New_York',
concurrency: 5,
}, async () => {
let terminateFunction = false;
// firebase functions can only run max every minute, so we need to loop for 1 minute since we want to run this every 3 seconds.
setTimeout(() => terminateFunction = true, 59_000);
while (true) {
// we don't want the function to run for longer than 1 minute, since we schedule it to run every minute anyway.
if (terminateFunction) break;
await syncData();
await new Promise(resolve => setTimeout(resolve, 3_000));
}
});
我想每3秒同步一些公司数据。但由于 Google Firebase 函数的最小调度时间为每分钟一分钟,因此我必须循环直到一分钟结束。
问题是,Firebase 有时会跳过运行。这意味着该函数不会运行整整一分钟。
请参阅下面日志中的间隙。
有人可以帮忙吗?
事实证明,问题是我们在 Node 18 上使用了 fetch API,这是实验性的。该函数每 3 秒使用 fetch 发出大约 12 个 http 请求,有时从其中一个 fetch 调用返回的承诺不会“履行” - 这意味着它不会解析或拒绝。
我只是将 Node 版本号从 18 更改为 20,它就开始正常工作了。