Jeśli chcesz zaplanować wykonywanie funkcji w określonych porach, użyj onSchedule
obsługiwanego przez firebase-functions/v2/scheduler
.
Te funkcje używają Cloud Scheduler do wywoływania logiki funkcji w określonych przez Ciebie odstępach czasu.
Zanim zaczniesz
Aby można było korzystać z tego rozwiązania w projekcie Firebase, musi on być objęty abonamentem Blaze. Jeśli nie masz jeszcze abonamentu Blaze, przejdź na wyższy abonament.
Chociaż wymaga to rozliczeń, ogólny koszt powinien być umiarkowany, ponieważ każde zadanie Cloud Scheduler kosztuje 0,10 USD miesięcznie, a na koncie Google można uruchomić 3 zadania bezpłatnie. Kalkulator cen Blaze pozwala oszacować koszty na podstawie przewidywanego wykorzystania.
W projekcie musi być włączony interfejs Cloud Scheduler API. Większość projektów Firebase powinna mieć już włączoną tę funkcję. Możesz to sprawdzić w konsoli Google Cloud.
Tworzenie zaplanowanej funkcji
W Cloud Functions for Firebase logika planowania znajduje się w kodzie funkcji i nie wymaga specjalnych wymagań dotyczących czasu wdrażania. Aby na przykład raz dziennie usuwać nieaktywne konta użytkowników, możesz napisać funkcję, która rozpoczyna się od tych instrukcji importowania:
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()
Następnie możesz użyć onSchedule
, aby rozpocząć 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. 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ę, zadanie algorytmu szeregowania i funkcja HTTP są tworzone automatycznie. Interfejs wiersza poleceń Firebase powtarza nazwę funkcji i możesz wyświetlić zadanie oraz funkcję w konsoli Google Cloud. Temat ma nazwę utworzoną według tej konwencji:
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 zadanie Cloud Schedulerma uprawnienia do uruchomienia funkcji.