Jeśli chcesz zaplanować uruchamianie funkcji o określonych porach, użyj modułu obsługi onSchedule udostępnianego przez firebase-functions/v2/scheduler.
Te funkcje używają Cloud Scheduler
do wywoływania logiki funkcji w zdefiniowanych przez Ciebie porach lub odstępach czasu.
Zanim zaczniesz
Za zaplanowane funkcje są naliczane opłaty, ale ogólny koszt powinien być do opanowania, ponieważ każde Cloud Scheduler zadanie kosztuje 0, 10 USD miesięcznie, a na każde konto Google przysługują 3 bezpłatne zadania. Kalkulator cen Blaze pozwala oszacować koszty na podstawie przewidywanego wykorzystania.
W projekcie musi być włączony interfejs Cloud Scheduler API. W większości projektów Firebase powinien być już włączony. Możesz to sprawdzić w konsoli Google Cloud.
Pisanie zaplanowanej funkcji
W Cloud Functions for Firebase logika planowania znajduje się w kodzie funkcji, nie ma specjalnych wymagań dotyczących wdrożenia. Aby na przykład codziennie czyścić nieaktywne konta użytkowników, możesz napisać funkcję zaczynającą się od tych instrukcji importu:
Node.js
// The Cloud Functions for Firebase SDK to set up triggers and logging.
const {onSchedule} = require("firebase-functions/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()
Następnie możesz użyć onSchedule, aby uruchomić zadanie 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 obsługuje zarówno składnię Unix Crontab, jak i App Engine syntax .Cloud Scheduler Aby na przykład użyć Crontab, wykonaj te czynności:
Node.js
exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
// ...
});
Python
@scheduler_fn.on_schedule(schedule="5 11 * * *")
Wdrażanie zaplanowanej funkcji
Gdy wdrażasz zaplanowaną funkcję, automatycznie tworzone są zadanie harmonogramu i funkcja HTTP. Interfejs wiersza poleceń Firebase wyświetla nazwę funkcji, a zadanie i funkcję możesz zobaczyć w konsoli Google Cloud. Nazwa tematu jest zgodna z tą konwencją:
firebase-schedule-function_name-region
Przykład:
firebase-schedule-accountcleanup-us-east1.
O zaplanowanej godzinie domyślne konto usługi Compute wywołuje powiązaną funkcję HTTP. Oznacza to, że tylko powiązane Cloud Scheduler zadanie ma uprawnienia do uruchamiania funkcji.