Percobaan ulang tugas dan praktik terbaik checkpoint

Setiap tugas atau bahkan eksekusi tugas dapat gagal karena berbagai alasan. Halaman ini berisi praktik terbaik untuk menangani kegagalan tersebut dan berpusat pada pemulaian ulang tugas dan checkpoint tugas.

Menggunakan percobaan ulang tugas

Setiap tugas tugas dapat gagal karena berbagai alasan, termasuk masalah dengan dependensi aplikasi, kuota, atau bahkan peristiwa sistem internal. Sering kali masalah tersebut bersifat sementara dan tugas akan berhasil setelah dicoba lagi.

Secara default, setiap tugas akan otomatis dicoba ulang hingga 3 kali. Hal ini membantu memastikan tugas akan berjalan hingga selesai meskipun mengalami kegagalan tugas sementara. Anda juga dapat menyesuaikan jumlah maksimum percobaan ulang. Namun, jika Anda mengubah setelan default, Anda harus menentukan minimal satu percobaan ulang.

Merencanakan mulai ulang tugas kerja

Jadikan tugas Anda idempotent sehingga tugas yang dimulai ulang tidak akan mengakibatkan output menjadi rusak atau terduplikasi. Artinya, tulis logika berulang yang memiliki kesamaan perilaku untuk sekumpulan input tertentu, berapa kali pun input diulang atau kapan pun input tersebut dijalankan.

Tulis output ke lokasi yang berbeda dengan data input Anda sehingga data input tetap utuh. Dengan demikian, saat tugas kembali berjalan, tugas tersebut dapat mengulangi proses dari awal dan tetap mendapatkan hasil yang sama.

Hindari duplikasi data output dengan menggunakan kembali ID unik yang sama atau memeriksa apakah output sudah ada atau belum. Duplikat data menunjukkan kerusakan data pada tingkat koleksi.

Menggunakan checkpoint

Jika memungkinkan, lakukan checkpoint sehingga saat tugas dimulai ulang setelah mengalami kegagalan, tugas tersebut dapat dilanjutkan dari bagian yang terakhir kali dijalankan, bukan dimulai ulang dari awal. Tindakan ini dapat mempercepat tugas Anda, serta meminimalkan biaya yang tidak diperlukan.

Tuliskan hasil parsial secara berkala dan tunjukkan progres yang dibuat ke lokasi penyimpanan persisten seperti Cloud Storage atau database. Saat tugas dimulai, cari hasil parsial pada saat startup. Jika hasil parsial ditemukan, mulailah memproses dari bagian yang terakhir kali dijalankan.

Jika tugas Anda tidak memungkinkan untuk melakukan checkpoint, pertimbangkan untuk membaginya menjadi bagian yang lebih kecil dan menjalankan tugas yang lebih banyak.

Contoh checkpoint 1: menghitung Pi

Jika Anda memiliki tugas yang menjalankan algoritma rekursif, seperti menghitung Pi ke banyak angka desimal, dan menggunakan paralelisme yang ditetapkan ke nilai 1:

  • Tulis progres setiap 10 menit atau tergantung pada toleransi tugas Anda yang hilang, ke objek pi-progress.txt di Cloud Storage.
  • Saat tugas dimulai, buat kueri objek pi-progress.txt dan muat nilainya sebagai awalan. Gunakan nilai tersebut sebagai input awal ke fungsi Anda.
  • Tulis hasil akhir Anda ke Cloud Storage sebagai objek dengan nama pi-complete.txt untuk menghindari duplikasi melalui eksekusi paralel atau berulang, atau tulis pi-complete-DATE.txt untuk membedakannya berdasarkan tanggal penyelesaian.

Contoh checkpoint 2: memproses 10.000 data dari Cloud SQL

Jika Anda memiliki tugas memproses 10.000 data dalam database relasional seperti Cloud SQL:

  • Ambil data untuk diproses dengan kueri SQL seperti SELECT * FROM example_table LIMIT 10000
  • Tulis kumpulan data yang diperbarui dalam batch 100 sehingga pemrosesan yang signifikan tidak hilang saat terjadi gangguan.
  • Saat data dicatat, tulis data mana yang sudah diproses. Anda dapat menambahkan kolom boolean yang diproses ke tabel dan ditetapkan 1 jika pemrosesan dikonfirmasi.
  • Saat tugas dimulai, kueri yang digunakan guna mengambil item untuk pemrosesan harus menambahkan kondisi yang diproses = 0.
  • Dalam percobaan ulang sederhana, teknik ini juga mendukung pembagian tugas menjadi tugas yang lebih kecil, seperti mengubah kueri untuk memilih 100 data sekaligus: LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100, dan menjalankan 100 tugas untuk memproses keseluruhan 10.000 data. CLOUD_RUN_TASK_INDEX adalah variabel lingkungan bawaan yang ada di dalam container yang menjalankan tugas Cloud Run.

Dengan menggunakan semua bagian ini secara bersamaan, kueri akhir akan terlihat seperti ini: SELECT * FROM example_table WHERE processed = 0 LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100

Langkah berikutnya