Jika Anda ingin menjadwalkan fungsi untuk dijalankan pada waktu yang ditentukan, gunakan
pengendali onSchedule
yang disediakan oleh firebase-functions/v2/scheduler
.
Fungsi-fungsi ini menggunakan Cloud Scheduler untuk memanggil logika fungsi pada waktu atau interval yang Anda tentukan.
Sebelum memulai
Untuk menggunakan solusi ini di project Firebase, project Anda harus menggunakan paket harga Blaze. Jika belum menggunakan paket Blaze, upgrade paket harga Anda.
Meskipun penagihan diperlukan, biaya keseluruhan dapat dikelola, karena setiap tugas Cloud Scheduler memerlukan biaya $0,10 (USD) per bulan, dan terdapat kuota tiga tugas per akun Google, tanpa dikenai biaya. Gunakan kalkulator harga paket Blaze untuk membuat perkiraan biaya berdasarkan penggunaan yang Anda proyeksikan.
Cloud Scheduler API harus diaktifkan untuk project Anda. Fitur ini seharusnya sudah diaktifkan untuk sebagian besar project Firebase. Anda dapat memverifikasinya di Google Cloud Platform Console.
Menulis fungsi terjadwal
Di Cloud Functions for Firebase, logika penjadwalan berada di kode fungsi Anda, tanpa persyaratan waktu deploy khusus. Misalnya, untuk membersihkan akun pengguna yang tidak aktif sekali sehari, Anda dapat menulis fungsi yang dimulai dengan pernyataan impor berikut:
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 (pratinjau)
# 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()
Kemudian, Anda dapat menggunakan onSchedule
untuk memulai tugas 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 (pratinjau)
# 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()
Baik sintaks Unix Crontab maupun App Engine didukung oleh Cloud Scheduler. Misalnya, untuk menggunakan Crontab, lakukan hal seperti ini:
Node.js
exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
// ...
});
Python (pratinjau)
@scheduler_fn.on_schedule(schedule="5 11 * * *")
Men-deploy fungsi terjadwal
Saat Anda men-deploy fungsi terjadwal, tugas penjadwal dan fungsi HTTP akan dibuat secara otomatis. Firebase CLI mencerminkan nama fungsi, dan Anda dapat melihat tugas dan fungsi tersebut di GCP Console. Topiknya diberi nama sesuai dengan konvensi berikut:
firebase-schedule-function_name-region
Contoh:
firebase-schedule-accountcleanup-us-east1.
Pada waktu yang dijadwalkan, akun layanan komputasi default akan memanggil fungsi HTTP terkait. Artinya, hanya tugas Cloud Scheduler terkait yang memiliki izin untuk menjalankan fungsi tersebut.