Если вы хотите запланировать запуск функций в определённое время, используйте обработчик 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 логика планирования находится в коде функций, без особых требований к времени развёртывания. Например, для ежедневной очистки неактивных учётных записей пользователей можно написать функцию, начинающуюся со следующих операторов импорта:
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;
Питон
# 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");
});
Питон
# 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) => {
// ...
});
Питон
@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 имеет разрешение на запуск этой функции.