جدولة الدوال


إذا كنت تريد جدولة الدوالّ لتشغيلها في أوقات محدّدة، استخدِم معالج onSchedule المقدَّم من firebase-functions/v2/scheduler. تستخدِم هذه الدوالّ Cloud Scheduler لاستدعاء منطق الدالة في الأوقات أو الفواصل الزمنية التي تحدّدها.

قبل البدء

لاستخدام هذا الحل في مشروعك على Firebase، يجب أن يكون مشروعك مُدرَجًا في خطة أسعار Blaze. إذا لم يكن التطبيق متوفرًا في خطة Blaze، عليك ترقية خطة الأسعار.

على الرغم من أنّ الفوترة مطلوبة، يمكنك توقّع أن تكون التكلفة الإجمالية قابلة للإدارة، لأنّه تبلغ تكلفة كل مهمة Cloud Scheduler 0.10 دولار أمريكي (أو ما يعادله بالعملة المحلية) في الشهر، وهناك إذن بثلاث مهام لكل حساب على Google بدون أي رسوم. استخدِم حاسبة أسعار Blaze لإنشاء تقدير للتكلفة استنادًا إلى معدّل الاستخدام المتوقّع.

يجب تفعيل واجهة برمجة التطبيقات 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;

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 CLI تكرار اسم الدالة، ويمكنك عرض المهمة والدالة في Google Cloud Console. يتمّ تسمية الموضوع وفقًا للاصطلاح التالي:

firebase-schedule-function_name-region

على سبيل المثال:

firebase-schedule-accountcleanup-us-east1.

في الوقت المحدَّد، يستدعي حساب خدمة Compute Engine التلقائي دالة HTTP المرتبطة. وهذا يعني أنّه لا يملك سوى Cloud Scheduler الوظيفة المرتبطة الإذن بتشغيل الدالة.