Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Coba lagi fungsi asinkron

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Dokumen ini menjelaskan bagaimana Anda dapat meminta fungsi latar belakang asinkron (non-HTTPS) untuk mencoba lagi jika gagal.

Semantik coba lagi

Cloud Functions menjamin setidaknya satu kali eksekusi fungsi yang digerakkan oleh peristiwa untuk setiap peristiwa yang dipancarkan oleh sumber peristiwa. Namun, secara default, jika pemanggilan fungsi diakhiri dengan kesalahan, fungsi tersebut tidak akan dipanggil lagi, dan acara akan dihentikan. Saat Anda mengaktifkan percobaan ulang pada fungsi yang digerakkan oleh peristiwa, Cloud Functions akan mencoba lagi pemanggilan fungsi yang gagal hingga selesai dengan sukses atau periode percobaan ulang berakhir (secara default, setelah 7 hari).

Saat percobaan ulang tidak diaktifkan untuk suatu fungsi, yang merupakan default, fungsi tersebut selalu melaporkan bahwa itu dijalankan dengan sukses, dan 200 OK mungkin muncul di lognya. Ini terjadi bahkan jika fungsi mengalami kesalahan. Untuk memperjelas saat fungsi Anda mengalami kesalahan, pastikan untuk melaporkan kesalahan dengan benar.

Mengapa fungsi yang digerakkan oleh peristiwa gagal diselesaikan

Pada kesempatan yang jarang terjadi, suatu fungsi mungkin keluar sebelum waktunya karena kesalahan internal, dan secara default fungsi tersebut mungkin atau mungkin tidak dicoba ulang secara otomatis.

Biasanya, fungsi yang digerakkan oleh peristiwa mungkin gagal untuk diselesaikan dengan sukses karena kesalahan yang dilemparkan ke dalam kode fungsi itu sendiri. Beberapa penyebab yang mungkin terjadi adalah sebagai berikut:

  • Fungsi berisi bug dan runtime melontarkan pengecualian.
  • Fungsi tidak dapat mencapai titik akhir layanan, atau waktu habis saat mencoba mencapai titik akhir.
  • Fungsi sengaja melempar pengecualian (misalnya, ketika parameter gagal validasi).
  • Saat fungsi yang ditulis di Node.js mengembalikan janji yang ditolak atau meneruskan nilai non- null ke panggilan balik.

Dalam salah satu kasus di atas, fungsi berhenti dijalankan secara default dan acara tersebut dibuang. Jika Anda ingin mencoba kembali fungsi saat terjadi kesalahan, Anda dapat mengubah kebijakan coba ulang default dengan menyetel properti "coba lagi saat gagal" . Hal ini menyebabkan acara dicoba berulang kali hingga beberapa hari hingga fungsi berhasil diselesaikan.

Mengaktifkan dan menonaktifkan percobaan ulang

Menggunakan Konsol GCP

Anda dapat mengaktifkan atau menonaktifkan percobaan ulang di GCP Console sebagai berikut:

  1. Buka halaman Ikhtisar Cloud Functions di Cloud Platform Console.

  2. Klik Buat fungsi . Alternatifnya, klik fungsi yang ada untuk membuka laman detailnya dan klik Edit .

  3. Isi kolom wajib untuk fungsi Anda.

  4. Pastikan kolom Pemicu disetel ke jenis pemicu berbasis peristiwa, seperti Cloud Pub/Sub atau Cloud Storage.

  5. Luaskan setelan lanjutan dengan mengeklik Lainnya .

  6. Centang atau hapus centang pada kotak berlabel Retry on failure .

Dalam kode fungsi

Dengan Cloud Functions for Firebase, Anda dapat mengaktifkan percobaan ulang dalam kode untuk suatu fungsi. Untuk melakukan ini untuk fungsi latar belakang seperti functions.foo.onBar(myHandler); , gunakan runWith dan konfigurasikan kebijakan kegagalan:

functions.runWith({failurePolicy: true}).foo.onBar(myHandler);

Menyetel true seperti yang ditunjukkan mengonfigurasi fungsi untuk mencoba lagi jika gagal.

Praktik terbaik

Bagian ini menjelaskan praktik terbaik untuk menggunakan percobaan ulang.

Gunakan coba lagi untuk menangani kesalahan sementara

Karena fungsi Anda dicoba ulang terus menerus hingga eksekusi berhasil, kesalahan permanen seperti bug harus dihilangkan dari kode Anda melalui pengujian sebelum mengaktifkan percobaan ulang. Percobaan ulang paling baik digunakan untuk menangani kegagalan intermiten/sementara yang memiliki kemungkinan resolusi tinggi saat mencoba ulang, seperti titik akhir atau waktu tunggu layanan yang tidak stabil.

Tetapkan kondisi akhir untuk menghindari loop coba ulang tanpa batas

Ini adalah praktik terbaik untuk melindungi fungsi Anda dari perulangan terus menerus saat menggunakan percobaan ulang. Anda dapat melakukannya dengan menyertakan kondisi akhir yang terdefinisi dengan baik, sebelum fungsi mulai diproses. Perhatikan bahwa teknik ini hanya berfungsi jika fungsi Anda berhasil dimulai dan mampu mengevaluasi kondisi akhir.

Pendekatan sederhana namun efektif adalah membuang acara dengan stempel waktu yang lebih lama dari waktu tertentu. Ini membantu untuk menghindari eksekusi yang berlebihan ketika kegagalan terus-menerus atau berumur lebih lama dari yang diharapkan.

Misalnya, cuplikan kode ini membuang semua peristiwa yang lebih lama dari 10 detik:

const eventAgeMs = Date.now() - Date.parse(event.timestamp);
const eventMaxAgeMs = 10000;
if (eventAgeMs > eventMaxAgeMs) {
  console.log(`Dropping event ${event} with age[ms]: ${eventAgeMs}`);
  callback();
  return;
}

Gunakan catch dengan Janji

Jika fungsi Anda telah mengaktifkan percobaan ulang, setiap kesalahan yang tidak tertangani akan memicu percobaan ulang. Pastikan kode Anda menangkap kesalahan apa pun yang seharusnya tidak mengakibatkan percobaan ulang.

Berikut adalah contoh dari apa yang harus Anda lakukan:

return doFooAsync().catch((err) => {
    if (isFatal(err)) {
        console.error(`Fatal error ${err}`);
    }
    return Promise.reject(err);
});

Jadikan fungsi berbasis peristiwa yang dapat dicoba ulang menjadi idempoten

Fungsi berbasis peristiwa yang dapat dicoba ulang harus idempoten. Berikut adalah beberapa panduan umum untuk membuat fungsi seperti itu idempoten:

  • Banyak API eksternal (seperti Stripe) memungkinkan Anda menyediakan kunci idempotensi sebagai parameter. Jika Anda menggunakan API semacam itu, Anda harus menggunakan ID peristiwa sebagai kunci idempotensi.
  • Idempotensi bekerja dengan baik dengan setidaknya sekali pengiriman, karena membuatnya aman untuk dicoba lagi. Jadi praktik terbaik umum untuk menulis kode yang andal adalah menggabungkan idempotensi dengan percobaan ulang.
  • Pastikan kode Anda idempoten secara internal. Sebagai contoh:
    • Pastikan bahwa mutasi dapat terjadi lebih dari satu kali tanpa mengubah hasilnya.
    • Permintaan status basis data dalam transaksi sebelum memutasikan status.
    • Pastikan semua efek samping itu sendiri idempoten.
  • Terapkan pemeriksaan transaksional di luar fungsi, terlepas dari kode. Misalnya, pertahankan status di suatu tempat yang merekam bahwa ID peristiwa tertentu telah diproses.
  • Tangani panggilan fungsi duplikat di luar jalur. Misalnya, miliki proses pembersihan terpisah yang membersihkan setelah pemanggilan fungsi duplikat.