Melakukan Lease Tugas Pull

Setelah tugas berada dalam pull queue, worker melakukan lease untuk tugas tersebut. Setelah tugas diproses, worker harus menghapusnya.

Sebelum memulai

Konteks penting

  • Metode ini hanya berlaku untuk worker yang berjalan dalam layanan di lingkungan standar.
  • Saat menggunakan pull queue, Anda bertanggung jawab untuk menskalakan worker berdasarkan volume pemrosesan Anda.

Tugas leasing

Setelah tugas berada dalam antrean, worker dapat melakukan lease pada satu atau beberapa tugas tersebut menggunakan metode lease_tasks(). Mungkin ada keterlambatan singkat sebelum tugas yang baru ditambahkan menggunakan add() menjadi tersedia melalui lease_tasks().

Saat meminta lease, Anda menentukan jumlah tugas yang akan di-lease (hingga maksimum 1.000 tugas) dan durasi lease dalam hitungan detik (hingga maksimum satu minggu). Durasi lease harus cukup lama untuk memastikan bahwa tugas paling lambat memiliki waktu untuk diselesaikan sebelum periode lease berakhir. Anda dapat mengubah lease tugas menggunakan modify_task_lease().

Leasing tugas membuat tugas tidak tersedia untuk diproses oleh worker lain, dan tetap tidak tersedia hingga periode lease berakhir.

Metode lease_tasks() menampilkan objek Task yang berisi daftar tugas yang di-lease dari antrean.

Contoh kode berikut menyewakan 100 tugas dari antrean pull-queue selama satu jam:

from google.appengine.api import taskqueue

q = taskqueue.Queue('pull-queue')
q.lease_tasks(3600, 100)

Membuat batch dengan tag tugas

Tidak semua tugas itu sama; kode Anda dapat "memberi tag" pada tugas lalu memilih tugas untuk di-lease berdasarkan tag. Tag berfungsi sebagai filter.

from google.appengine.api import taskqueue

q = taskqueue.Queue('pull-queue')
q.add(taskqueue.Task(payload='parse1', method='PULL', tag='parse'))
q.add(taskqueue.Task(payload='parse2', method='PULL', tag='parse'))
q.add(taskqueue.Task(payload='render1', method='PULL', tag='render'))
q.add(taskqueue.Task(payload='render2', method='PULL', tag='render'))

q.lease_tasks_by_tag(3600, 100, 'render') # leases render tasks, but not parse

q.lease_tasks_by_tag(3600, 100) # Leases up to 100 tasks that have same tag.

Mengatur laju polling

Worker yang melakukan polling pada antrean untuk tugas yang akan di-lease harus mendeteksi apakah mereka mencoba untuk melakukan lease tugas lebih cepat daripada yang dapat disediakan oleh antrean. Jika kegagalan ini terjadi, pengecualian dari lease_tasks() berikut dapat dibuat:

  • google.appengine.api.taskqueue.TransientError
  • google.appengine.runtime.apiproxy_errors.DeadlineExceededError


Kode Anda harus menangkap pengecualian ini, berhenti memanggil lease_tasks(), lalu coba lagi nanti. Untuk menghindari masalah ini, pertimbangkan untuk menetapkan batas waktu RPC yang lebih tinggi saat memanggil lease_tasks(). Anda juga harus berhenti saat permintaan lease menampilkan daftar tugas kosong.

Jika Anda membuat lebih dari 10 permintaan LeaseTasks per antrean per detik, hanya 10 permintaan pertama yang akan menampilkan hasil. Jika permintaan melebihi batas ini, OK akan ditampilkan dengan hasil nol.

Memantau tugas di konsol Google Cloud

Untuk melihat informasi tentang semua tugas dan antrean dalam aplikasi Anda:

  1. Buka halaman Cloud Tasks di konsol Google Cloud dan cari nilai Pull di kolom Type.

    Buka Cloud Tasks

  2. Klik nama antrean yang Anda minati, lalu halaman detail antrean akan terbuka. Tindakan ini akan menampilkan semua tugas dalam antrean yang dipilih.

Menghapus tugas

Setelah menyelesaikan tugas, worker perlu menghapus tugas dari antrean. Jika Anda melihat tugas tersisa dalam antrean setelah worker selesai memprosesnya, kemungkinan worker tersebut gagal; dalam hal ini, tugas akan diproses oleh worker lain.

Anda dapat menghapus daftar tugas, seperti yang ditampilkan oleh lease_task(), hanya dengan meneruskannya ke delete_tasks():

from google.appengine.api import taskqueue

q = taskqueue.Queue('pull-queue')
tasks = q.lease_tasks(3600, 100)
# Perform some work with the tasks here
q.delete_tasks(tasks)

Contoh end-to-end dari pull queue

Untuk contoh end-to-end yang sederhana tetapi lengkap tentang penggunaan pull queue di Python, lihat appengine-pullqueue-counter.