Функции планирования

Если вы хотите, чтобы функции выполнялись в определенное время, используйте обработчик onSchedule, предоставленный firebase-functions/v2/scheduler. Эти функции используют Cloud Scheduler, чтобы вызывать логику функции в заданное вами время или интервалы.

Подготовка

Хотя за запланированные функции взимается плата, общая стоимость будет приемлемой, поскольку каждое задание Cloud Scheduler стоит 0, 10 долл.США в месяц, а на каждый аккаунт Google бесплатно предоставляется три задания. Чтобы рассчитать стоимость использования Blaze на основе прогнозируемого объема, воспользуйтесь калькулятором цен.

В вашем проекте должен быть включен Cloud Scheduler API. Она должна быть включена в большинстве проектов 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/scheduler");
const {logger} = require("firebase-functions");

// The Firebase Admin SDK to delete inactive users.
const {initializeApp} = require("firebase-admin/app");
const {getAuth} = require("firebase-admin/auth");
initializeApp();

// The es6-promise-pool to limit the concurrency of promises.
const PromisePool = /** @type {PromisePoolConstructor} */ (
  require("es6-promise-pool")
);
// 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()

Затем вы можете использовать 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");
});

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 поддерживает как синтаксис Unix Crontab, так и синтаксис App Engine. Например, чтобы использовать Crontab, выполните следующие действия:

Node.js

exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
  // ...
});

Python

@scheduler_fn.on_schedule(schedule="5 11 * * *")

Как развернуть запланированную функцию

При развертывании запланированной функции автоматически создаются задание планировщика и HTTP-функция. Интерфейс командной строки Firebase выводит название функции, а задание и функцию можно посмотреть в консоли Google Cloud. Название темы формируется по следующему принципу:

firebase-schedule-function_name-region

Пример:

firebase-schedule-accountcleanup-us-east1.

В назначенное время сервисный аккаунт по умолчанию вызывает связанную HTTP-функцию. Это означает, что только связанное задание Cloud Scheduler имеет разрешение на выполнение функции.