Если вы хотите запланировать запуск функций в определенное время, используйте обработчик onSchedule
, предоставленный firebase-functions/v2/scheduler
. Эти функции используют Cloud Scheduler для вызова логики функций в определенное вами время или интервалы.
Прежде чем начать
Чтобы использовать это решение в вашем проекте Firebase, ваш проект должен быть на тарифном плане Blaze. Если он еще не на тарифном плане Blaze, обновите свой тарифный план .
Хотя выставление счетов обязательно, вы можете ожидать, что общая стоимость будет управляемой, так как каждое задание Cloud Scheduler стоит 0,10 долл. США в месяц, и есть разрешение на три задания на аккаунт Google, бесплатно. Используйте калькулятор цен Blaze, чтобы создать смету расходов на основе вашего прогнозируемого использования.
API Cloud Scheduler должен быть включен для вашего проекта. Он должен быть уже включен для большинства проектов Firebase; вы можете проверить это в консоли Google Cloud .
Написать запланированную функцию
В Cloud Functions for Firebase логика планирования находится в коде функций без особых требований к времени развертывания. Например, чтобы очищать неактивные учетные записи пользователей один раз в день, вы можете написать функцию, начинающуюся со следующих операторов импорта:
// 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;
# 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 :
// 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");
});
# 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()
Синтаксис Unix Crontab и App Engine поддерживается Cloud Scheduler . Например, чтобы использовать Crontab, сделайте что-то вроде этого:
exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
// ...
});
@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 имеет разрешение на запуск функции.