安排函数运行时间


如果您要安排函数在指定时间运行,请使用 firebase-functions/v2/scheduler 提供的 onSchedule 处理程序。这些函数使用 Cloud Scheduler 按您定义的时间或间隔时间调用函数逻辑。

准备工作

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

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

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

编写预定函数

在 Cloud Functions for Firebase 中,预定逻辑位于您的函数代码中,没有特殊的部署时间要求。 例如,如需每天清理非活跃用户账号一次,您可以编写一个函数,从以下 import 语句开始:

Node.js

// The Cloud Functions for Firebase SDK to set up triggers and logging.
const {onSchedule} = require("firebase-functions/v2/scheduler");
const {logger} = require("firebase-functions");

// The Firebase Admin SDK to delete inactive users.
const admin = require("firebase-admin");
admin.initializeApp();

// The es6-promise-pool to limit the concurrency of promises.
const PromisePool = require("es6-promise-pool").default;
// Maximum concurrent account deletions.
const MAX_CONCURRENT = 3;

Python(预览版)

# The Cloud Functions for Firebase SDK to set up triggers and logging.
from firebase_functions import scheduler_fn

# The Firebase Admin SDK to delete users.
import firebase_admin
from firebase_admin import auth

firebase_admin.initialize_app()

然后,您可以使用 onSchedule 启动一项 Cloud Scheduler 任务:

Node.js

// 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");
});

Python(预览版)

# Run once a day at midnight, to clean up inactive users.
# Manually run the task here https://console.cloud.google.com/cloudscheduler
@scheduler_fn.on_schedule(schedule="every day 00:00")
def accountcleanup(event: scheduler_fn.ScheduledEvent) -> None:
    """Delete users who've been inactive for 30 days or more."""
    user_page: auth.ListUsersPage | None = auth.list_users()
    while user_page is not None:
        inactive_uids = [
            user.uid
            for user in user_page.users
            if is_inactive(user, timedelta(days=30))
        ]
        auth.delete_users(inactive_uids)
        user_page = user_page.get_next_page()


Cloud Scheduler 支持 Unix Crontab 和 App Engine 语法。例如,如需使用 Crontab,您可以使用如下代码:

Node.js

exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
  // ...
});

Python(预览版)

@scheduler_fn.on_schedule(schedule="5 11 * * *")

部署预定函数

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

firebase-schedule-function_name-region

例如:

firebase-schedule-accountcleanup-us-east1。

在计划的时间,默认计算服务账号会调用关联的 HTTP 函数。这意味着只有关联的 Cloud Scheduler 作业才有权运行该函数。