Program işlevleri


İşlevleri belirtilen zamanlarda çalışacak şekilde planlamak istiyorsanız firebase-functions/v2/scheduler tarafından sağlanan onSchedule işleyicisini kullanın. Bu işlevler, işlev mantığını tanımladığınız zamanlarda veya aralıklarda çağırmak için Cloud Scheduler kullanır.

Başlamadan önce

Bu çözümü Firebase projenizde kullanabilmeniz için projenizin Blaze fiyatlandırma planında olması gerekir. Henüz Blaze planında değilse fiyatlandırma planınızı yükseltin.

Faturalandırma gerekli olsa da her Cloud Scheduler işinin aylık maliyeti 0,10 ABD doları olduğu ve Google hesabı başına üç iş için ücretsiz kota bulunduğundan genel maliyetin makul olmasını bekleyebilirsiniz. Tahmini kullanımınıza göre maliyet tahmini oluşturmak için Blaze fiyat hesaplayıcıyı kullanın.

Projenizde Cloud Scheduler API etkinleştirilmiş olmalıdır. Bu özellik çoğu Firebase projesinde zaten etkinleştirilmiş olmalıdır. Google Cloud Console'da bu durumu doğrulayabilirsiniz.

Planlanmış bir işlev yazma

Cloud Functions for Firebase'te planlama mantığı, özel dağıtım zamanı koşulları olmadan işlev kodunuzda bulunur. Örneğin, etkin olmayan kullanıcı hesaplarını günde bir kez temizlemek için aşağıdaki içe aktarma ifadeleriyle başlayan bir işlev yazabilirsiniz:

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()

Ardından, Cloud Scheduler görevi başlatmak için onSchedule'ü kullanabilirsiniz:

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()

Hem Unix Crontab hem de App Engine söz dizimi Cloud Scheduler tarafından desteklenir. Örneğin, Crontab'ı kullanmak için aşağıdaki gibi bir işlem yapın:

Node.js

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

Python

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

Planlanmış işlev dağıtma

Planlanmış bir işlevi dağıttığınızda otomatik olarak bir planlayıcı işi ve HTTP işlevi oluşturulur. Firebase KSA, işlev adını yansıtır. İşi ve işlevi Google Cloud Console'da görüntüleyebilirsiniz. Konu, aşağıdaki kurala göre adlandırılır:

firebase-schedule-function_name-region

Örneğin:

firebase-schedule-accountcleanup-us-east1.

Varsayılan Compute hizmet hesabı, planlanan zamanda ilişkili HTTP işlevini çağırır. Bu, işlevi yalnızca ilişkili Cloud Scheduler işinin çalıştırma izni olduğu anlamına gelir.