安排函数运行时间

如果您要安排函数在指定时间运行,可使用 firebase-functions/v2/scheduler 子软件包。onSchedule 方法会创建 Pub/Sub 主题并使用 Cloud Scheduler 触发与该主题相关的事件,从而确保您的函数在预期的时间运行。

准备工作

如需在 Firebase 项目中使用此解决方案,您的项目必须采用 Blaze 定价方案。如果您目前使用的不是 Blaze 方案,请升级您的定价方案

虽然需要结算,但总费用是可控的,因为每项 Cloud Scheduler 作业每月费用为 0.10 美元,并且每个 Google 帐号可以享受三项免费作业的福利。您可以使用 Blaze 价格计算器来根据预计使用量估算费用。

必须为项目启用 Pub/Sub 和 Cloud Scheduler API。对于大多数 Firebase 项目而言,这些 API 应该已启用;您可以在 Google Cloud Platform 控制台中验证这些 API 是否已启用。

编写预定函数

在 Cloud Functions for Firebase 中,预定逻辑位于您的函数代码中,没有特殊的部署时间要求。如需创建预定函数,请使用 onSchedule 启动一项 Cloud Scheduler 任务。例如,如需每天清理非活跃用户帐号一次,您可以使用如下代码:

// Run once a day at midnight, to clean up the users
// Manually run the task here https://console.cloud.google.com/cloudscheduler
exports.accountcleanup = onSchedule("every day 00:00", async (event) => {
  // Fetch all user details.
  const inactiveUsers = await getInactiveUsers();

  // Use a pool so that we delete maximum `MAX_CONCURRENT` users in parallel.
  const promisePool = new PromisePool(
      () => deleteInactiveUser(inactiveUsers),
      MAX_CONCURRENT,
  );
  await promisePool.start();

  logger.log("User cleanup finished");
});

Cloud Scheduler 支持 Unix Crontab 和 App Engine 语法。例如,如需使用 Crontab 选择要在其中运行预定函数的特定时区,您可以使用如下代码:

exports.scheduledFunctionCrontab = functions.pubsub.schedule('5 11 * * *')
  .timeZone('America/New_York') // Users can choose timezone - default is UTC
  .onRun((context) => {
  console.log('This will be run every day at 11:05 AM Eastern!');
  return null;
});

timeZone 的值必须是 tz 数据库中的时区名称。如需详细了解受支持的属性,请参阅 Cloud Scheduler 参考文档

部署预定函数

在您部署预定函数时,系统会自动创建相关的调度器作业和 Pub/Sub 主题。Firebase CLI 会回显主题名称;您可以在 GCP 控制台中查看作业和主题。系统会根据以下惯例为主题命名:

firebase-scheduled-function_name-region

例如:

firebase-scheduled-scheduledFunctionCrontab-us-east1.