פונקציות תזמון


אם רוצים לתזמן פונקציות להפעלה בזמנים ספציפיים, צריך להשתמש ב-handler‏ onSchedule שסופק על ידי firebase-functions/v2/scheduler. הפונקציות האלה משתמשות ב-Cloud Scheduler כדי להפעיל את הלוגיקה של הפונקציה בזמנים או במרווחי הזמן שאתם מגדירים.

לפני שמתחילים

כדי להשתמש בפתרון הזה בפרויקט Firebase, הפרויקט צריך להיות במסלול התמחור Blaze. אם אתם לא מנויים לתוכנית Blaze, אתם צריכים לשדרג את תוכנית התמחור.

למרות שנדרש חיוב, העלות הכוללת צפויה להיות נמוכה, כי כל Cloud Scheduler משימה עולה 0.10$ (USD) לחודש, ויש מכסת שלוש משימות לכל חשבון 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/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()

אחר כך תוכלו להשתמש ב-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()

App Engine syntax ו-Unix Crontab נתמכים על ידי Cloud Scheduler. לדוגמה, כדי להשתמש ב-Crontab, מבצעים פעולה כמו זו:

Node.js

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

Python

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

פריסת פונקציה מתוזמנת

כשפורסים פונקציה מתוזמנת, נוצרות אוטומטית משימת תזמון ופונקציית HTTP. ה-CLI‏ Firebase מחזיר את שם הפונקציה, ואפשר לראות את העבודה ואת הפונקציה במסוף Google Cloud. השם של הנושא נקבע לפי המוסכמה הבאה:

firebase-schedule-function_name-region

לדוגמה:

firebase-schedule-accountcleanup-us-east1.

בזמן המתוזמן, חשבון השירות שמשמש כברירת מחדל ב-Compute Engine מפעיל את פונקציית ה-HTTP המשויכת. כלומר, רק למשימת Cloud Scheduler המשויכת יש הרשאה להפעיל את הפונקציה.