Jeśli chcesz zaplanować uruchamianie funkcji o określonych porach, użyj modułu obsługi onSchedule
udostępnianego przez firebase-functions/v2/scheduler
.
Funkcje te używają Cloud Scheduler, aby wywoływać logikę funkcji w określonych przez Ciebie momentach lub odstępach czasu.
Zanim zaczniesz
Aby używać tego rozwiązania w projekcie Firebase, musisz mieć abonament Blaze. Jeśli nie masz jeszcze abonamentu Blaze, przejdź na wyższy pakiet.
Wymagane jest rozliczenie, ale ogólny koszt powinien być przystępny, ponieważ każde Cloud Schedulerzadanie kosztuje 0, 10 USD miesięcznie, a na każde konto Google przysługują 3 bezpłatne zadania. Skorzystaj z kalkulatora cen Blaze, aby oszacować koszty na podstawie przewidywanego wykorzystania.
Interfejs Cloud Scheduler API musi być włączony w Twoim projekcie. W przypadku większości projektów Firebase powinna być już włączona. Możesz to sprawdzić w Google Cloud Console.
Pisanie zaplanowanej funkcji
W Cloud Functions for Firebase logika planowania znajduje się w kodzie funkcji i nie ma specjalnych wymagań dotyczących wdrażania. Aby na przykład raz dziennie usuwać 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/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ąć 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ę, automatycznie tworzone są zadanie harmonogramu i funkcja HTTP. Interfejs wiersza poleceń Firebase wyświetla nazwę funkcji, a zadanie i funkcję możesz wyświetlić w konsoli Google Cloud. Temat jest nazywany zgodnie 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 Schedulerzadanie ma uprawnienia do uruchamiania funkcji.