【问题标题】:How to skip a CRON (Cloud Function) execution if already running?如果已经运行,如何跳过 CRON(云函数)执行?
【发布时间】:2021-07-16 07:23:07
【问题描述】:

我的 Cloud Functions 中的 index.js 文件中有以下 CRON 函数:

// Starts the CRON every 5 minutes in order to get the latest sensors data
exports.cronFunction = functions
  // .region('europe-west1')
  .pubsub.schedule('2,7,12,17,22,27,32,37,42,47,52,57 * * * *')
  .timeZone('Europe/Paris')
  .onRun((context) => {
    const day = moment();
    const db = admin.database();

    console.log('CRON Start for all orders!');
    return updateStatsForDay(db, day, false, true).then(()=>{
      return true;
    }).catch(()=>{
      return false;
    });
});

问题是在特定时间,5分钟的窗口太短而无法完成脚本的运行,所以我的问题是:如果前一个仍在运行,有没有办法跳过新的执行?

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    所有云函数实例都是相互独立的,除非您自己跟踪它们,否则您无法检查实例是否已经处于活动状态。您可以在实时数据库中存储一个布尔值,并在每次触发函数时检查它。

    exports.cronFunction = functions
      .pubsub.schedule('* * * * *')
      .timeZone('Europe/Paris')
      .onRun(async (context) => {
        // Check if function is already running in database
        const dbRef = admin.database().ref("_status/")
        if ((await dbRef.once("value")).val().myFunction) return {error: "Function already running"}
        // Else update the value to true 
        await dbRef.update({myFunction: true})
        // Process the data
        // Turn the value back to false
        await dbRef.update({myFunction: false})
        // Terminate the function
    }); 
    

    【讨论】:

    • 感谢您的回答。在这种情况下是否需要所有 async/await 结构?
    • @YoannHercouet 不,您可以使用 then 和 catch 使用 Promise chaning。我只是使用 async await 来保持代码更干净。
    最近更新 更多