Fungsi antrean dengan Cloud Tasks

Fungsi antrean tugas memanfaatkan Google Cloud Tasks untuk membantu aplikasi Anda menjalankan tugas yang memakan waktu, intensif sumber daya, atau terbatas bandwidth secara asinkron, di luar alur aplikasi utama Anda.

Misalnya, bayangkan Anda ingin membuat cadangan dari sekumpulan besar file gambar yang saat ini dihosting di API dengan batas kecepatan. Untuk menjadi konsumen yang bertanggung jawab atas API tersebut, Anda harus menghormati batas tarif mereka. Plus, pekerjaan jangka panjang semacam ini bisa rentan terhadap kegagalan karena batas waktu dan batas memori.

Untuk mengurangi kerumitan ini, Anda dapat menulis fungsi antrean tugas yang menyetel opsi tugas dasar seperti scheduleTime , dan dispatchDeadline , lalu menyerahkan fungsi tersebut ke antrean di Cloud Tasks. Lingkungan Cloud Tasks dirancang khusus untuk memastikan kontrol kemacetan yang efektif dan kebijakan coba lagi untuk jenis operasi ini.

Firebase SDK for Cloud Functions for Firebase v3.20.1 dan yang lebih tinggi beroperasi bersama dengan Firebase Admin SDK v10.2.0 dan yang lebih tinggi untuk mendukung fungsi antrean tugas.

Menggunakan fungsi antrean tugas dengan Firebase dapat mengakibatkan biaya untuk pemrosesan Tugas Cloud. Lihat harga Cloud Tasks untuk informasi selengkapnya.

Membuat fungsi antrian tugas

Untuk menggunakan fungsi antrian tugas, ikuti alur kerja ini:

  1. Tulis fungsi antrean tugas menggunakan Firebase SDK untuk Cloud Functions.
  2. Uji fungsi Anda menggunakan Firebase Local Emulator Suite.
  3. Terapkan fungsi Anda dengan Firebase CLI. Saat menerapkan fungsi antrean tugas Anda untuk pertama kalinya, CLI akan membuat antrean tugas di Cloud Tasks dengan opsi (pembatasan tarif dan coba lagi) yang ditentukan dalam kode sumber Anda.
  4. Tambahkan tugas ke antrean tugas yang baru dibuat, dengan meneruskan parameter untuk menyiapkan jadwal eksekusi jika diperlukan. Anda dapat mencapainya dengan menulis kode menggunakan Admin SDK dan menerapkannya ke Cloud Functions for Firebase.

Menulis fungsi antrian tugas

Gunakan onDispatch untuk mulai menulis fungsi antrian tugas. Bagian penting dari penulisan fungsi antrian tugas adalah mengatur percobaan ulang per antrian dan konfigurasi pembatasan kecepatan. Contoh kode di halaman ini didasarkan pada aplikasi yang menyiapkan layanan yang mencadangkan semua gambar dari Astronomy Picture of the Day NASA :

Konfigurasi antrian tugas

Fungsi antrian tugas hadir dengan serangkaian pengaturan konfigurasi yang kuat untuk mengontrol batas kecepatan secara tepat dan mencoba kembali perilaku antrian tugas:

exports.backupApod = functions
    .runWith( {secrets: ["NASA_API_KEY"]})
    .tasks.taskQueue({
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }).onDispatch(async (data) => {
  • retryConfig.maxAttempts=5 : Setiap tugas dalam antrian tugas secara otomatis dicoba ulang hingga 5 kali. Ini membantu mengurangi kesalahan sementara seperti kesalahan jaringan atau gangguan layanan sementara dari layanan eksternal yang bergantung.
  • retryConfig.minBackoffSeconds=60 : Setiap tugas dicoba ulang setidaknya 60 detik dari setiap upaya. Ini memberikan buffer besar di antara setiap upaya sehingga kami tidak terburu-buru menghabiskan 5 upaya coba lagi terlalu cepat.
  • rateLimits.maxConcurrentDispatch=6 : Paling banyak 6 tugas dikirim pada waktu tertentu. Ini membantu memastikan aliran permintaan yang stabil ke fungsi yang mendasarinya dan membantu mengurangi jumlah instans aktif dan cold start.

Menguji fungsi antrean tugas menggunakan Firebase Local Emulator Suite

Fungsi antrean tugas di Firebase Local Emulator Suite ditampilkan sebagai fungsi HTTP sederhana. Anda dapat menguji fungsi tugas yang ditiru dengan mengirimkan permintaan HTTP POST dengan payload data json:

 # start the Firebase Emulators
 firebase emulators:start

 # trigger the emulated task queue function
 curl \
  -X POST                                            # An HTTP POST request...
  -H "content-type: application/json" \              # ... with a JSON body
  http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
  -d '{"data": { ... some data .... }}'              # ... with JSON encoded data

Menyebarkan fungsi antrian tugas

Terapkan fungsi antrean tugas menggunakan Firebase CLI:

$ firebase deploy --only functions:backupApod

Saat men-deploy fungsi antrean tugas untuk pertama kalinya, CLI membuat antrean tugas di Cloud Tasks dengan opsi (pembatasan tarif dan coba lagi) yang ditentukan dalam kode sumber Anda.

Jika Anda mengalami kesalahan izin saat menerapkan fungsi, pastikan peran IAM yang sesuai ditetapkan ke pengguna yang menjalankan perintah penerapan.

Enqueue fungsi

Fungsi antrian tugas dapat diantrekan di Cloud Tasks dari lingkungan server tepercaya seperti Cloud Functions for Firebase menggunakan Firebase Admin SDK untuk Node.js. Jika Anda baru menggunakan Admin SDK, lihat Menambahkan Firebase ke server untuk memulai.

Dalam alur biasa, Admin SDK membuat tugas baru, mengantrekannya di {cloudtasks_name}}, dan menyetel konfigurasi untuk tugas tersebut:

exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
  const queue = getFunctions().taskQueue("backupApod");
  const enqueues = [];
  for (let i = 0; i <= 10; i += 1) {
    // Enqueue each task with i*60 seconds day. Our task queue function
    // should process ~1 task/min.
    const scheduleDelaySeconds = i * 60 
    enqueues.push(
        queue.enqueue(
          { id: `task-${i}` },
          {
            scheduleDelaySeconds,
            dispatchDeadlineSeconds: 60 * 5 // 5 minutes
          },
        ),
    );
  }
  await Promise.all(enqueues);
  response.sendStatus(200);

});
  • scheduleDelaySeconds : Kode sampel mencoba menyebarkan eksekusi tugas dengan mengaitkan penundaan menit ke-N untuk tugas ke-N. Ini berarti memicu ~ 1 tugas/menit. Perhatikan bahwa Anda juga dapat menggunakan scheduleTime jika Anda ingin Cloud Tasks memicu tugas pada waktu tertentu.
  • dispatchDeadlineSeconds : Jumlah waktu maksimum Cloud Tasks akan menunggu hingga tugas selesai. Cloud Tasks akan mencoba kembali tugas tersebut setelah mencoba konfigurasi antrean lagi atau hingga tenggat waktu ini tercapai. Dalam contoh, antrean dikonfigurasi untuk mencoba kembali tugas hingga 5 kali, tetapi tugas dibatalkan secara otomatis jika seluruh proses (termasuk upaya coba lagi) membutuhkan waktu lebih dari 5 menit.

Penyelesaian masalah

Aktifkan pencatatan Tugas Cloud

Log dari Cloud Tasks berisi informasi diagnostik yang berguna seperti status permintaan yang terkait dengan tugas. Secara default, log dari Cloud Tasks dinonaktifkan karena besarnya volume log yang berpotensi dihasilkan di proyek Anda. Kami menyarankan Anda mengaktifkan log debug saat Anda secara aktif mengembangkan dan men-debug fungsi antrian tugas Anda. Lihat Mengaktifkan pencatatan .

Izin IAM

Anda mungkin melihat error PERMISSION DENIED saat mengantrekan tugas atau saat Cloud Tasks mencoba menjalankan fungsi antrean tugas Anda. Pastikan project Anda memiliki binding IAM berikut:

  • Identitas yang digunakan untuk mengantrekan tugas ke Cloud Tasks memerlukan izin IAM cloudtasks.tasks.create .

    Dalam contoh, ini adalah akun layanan default App Engine

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • Identitas yang digunakan untuk mengantrekan tugas ke Cloud Tasks memerlukan izin untuk menggunakan akun layanan yang terkait dengan tugas di Cloud Tasks.

    Dalam contoh, ini adalah akun layanan default App Engine .

Lihat dokumentasi Google Cloud IAM untuk petunjuk tentang cara menambahkan akun layanan default App Engine sebagai pengguna akun layanan default App Engine.

  • Identitas yang digunakan untuk memicu fungsi antrian tugas memerlukan izin cloudfunctions.functions.invoke .

    Dalam contoh, ini adalah akun layanan default App Engine

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker