排定函式


如果您想排定函式在特定時間執行,請使用 firebase-functions/v2/scheduler 提供的 onSchedule 處理常式。這些函式會使用 Cloud Scheduler 在您定義的時間或間隔中叫用函式邏輯。

事前準備

如要在 Firebase 專案中使用這項解決方案,專案必須採用 Blaze 定價方案。如果尚未採用 Blaze 方案,請升級定價方案

雖然需要帳單,但整體費用可控,因為每項 Cloud Scheduler 工作每月費用為 $0.10 美元,且每個 Google 帳戶可免費建立三項工作。使用 Blaze Pricing Calculator,根據您的預測使用量產生預估費用。

您必須為專案啟用 Cloud Scheduler API。大多數 Firebase 專案都已啟用這項功能,您可以在 Google Cloud 控制台中確認。

編寫排程函式

Cloud Functions for Firebase 中,排程邏輯會位於函式程式碼中,且沒有特殊的部署時間需求。舉例來說,如要每天清理閒置使用者帳戶,您可以編寫函式,並以以下匯入陳述式開始:

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 會回應函式名稱,您可以在 Google Cloud 控制台中查看工作和函式。主題的命名方式如下:

firebase-schedule-function_name-region

例如:

firebase-schedule-accountcleanup-us-east1.

在預定時間,預設運算服務帳戶會叫用相關的 HTTP 函式。也就是說,只有相關聯的 Cloud Scheduler 工作才有權執行函式。