Node.js 将文档写入Firestore的Firebase同步后台作业

Node.js 将文档写入Firestore的Firebase同步后台作业,node.js,firebase,google-cloud-firestore,google-cloud-functions,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,我有一个每分钟都在运行的后台工作来更新文档。 如果更新时间超过一分钟,我需要跳过下一个后台工作。 同步此逻辑的最佳方法是什么 我现在有 export const pickWinnerBackgroundJob = functions.pubsub.schedule('every 1 minutes').onRun(async (context) => { const lock = await admin.firestore() .collection(`lock`)

我有一个每分钟都在运行的后台工作来更新文档。 如果更新时间超过一分钟,我需要跳过下一个后台工作。 同步此逻辑的最佳方法是什么

我现在有

export const pickWinnerBackgroundJob = functions.pubsub.schedule('every 1 minutes').onRun(async (context) => {
    const lock = await admin.firestore()
        .collection(`lock`)
        .doc(BG_JOB_LOCK_DOCUMENT_ID)
        .get();

    if (lock.exists && lock.data()?.locked == true) {
        return;
    }

    await admin.firestore()
        .collection(LOCK_COLLECTION_NAME)
        .doc(BG_JOB_LOCK_DOCUMENT_ID)
        .set({ locked: true })

    var promises: Promise<any>;
    // Add document update promises and execute job

    return Promise.all(promises).then(() => {
        return admin.firestore()
            .collection(LOCK_COLLECTION_NAME)
            .doc(BG_JOB_LOCK_DOCUMENT_ID)
            .set({ locked: false })
    });
});
export const pickwinerbackgroundjob=functions.pubsub.schedule('every 1 minutes').onRun(异步(上下文)=>{
const lock=wait admin.firestore()
.collection(`lock`)
.doc(BG\u作业\u锁定\u文档\u ID)
.get();
if(lock.exists&&lock.data()?.lock==true){
返回;
}
等待管理员firestore()
.集合(锁定集合名称)
.doc(BG\u作业\u锁定\u文档\u ID)
.set({locked:true})
var承诺:承诺;
//添加文档更新承诺并执行作业
返回承诺。全部(承诺)。然后(()=>{
return admin.firestore()
.集合(锁定集合名称)
.doc(BG\u作业\u锁定\u文档\u ID)
.set({locked:false})
});
});

这是一种有效的方法吗?

这种方法看起来很合理,但你必须注意比赛条件。由于您可能无法完全阻止它们,因此您必须选择最适合您的需要的策略,因此:在出现争用时,您可能会多跳过一分钟,或者两个实例可能偶尔并行运行

或者,您可以将此云函数的值设置为1,而不用在代码中担心它。Firebase包装中的语法似乎是:

functions.pubsub.schedule('every 1 minutes').runWith({ maxInstances: 1 }).onRun(async (context) => {

您还可以使用每个函数调用在当前函数调用后一分钟内安排下一个函数调用。永远不能那样跑。(您确实需要确保它们保持运行,因此您可能还需要一只看门狗)

太棒了,maxInstances正是我所需要的,谢谢您实际上
属性“runWith”在“ScheduleBuilder”类型上不存在。ts(2339)
是的,我想知道这一点。不过,我看不出该optoin有任何例外或要求: