Halaman ini menjelaskan cara membuat tugas dan menempatkannya di push queue. Saat ingin memproses tugas, Anda harus membuat objek tugas baru dan meletakkannya di antrean. Anda dapat secara eksplisit menetapkan layanan dan pengendali yang memproses tugas, dan meneruskan data khusus tugas ke pengendali secara opsional. Anda juga dapat menyesuaikan konfigurasi untuk tugas, seperti menjadwalkan waktu pada masa mendatang saat tugas harus dijalankan atau membatasi frekuensi percobaan ulang tugas yang diinginkan jika gagal.
Membuat tugas baru
Untuk membuat dan mengantrekan tugas, panggil fungsi taskqueue.add().
Kode berikut membuat tugas yang menargetkan layanan bernama worker
dan
memanggil pengendalinya dengan menetapkan URL /update-counter
:
Anda juga dapat membuat objek Task dan memanggil metode add()-nya.
Menentukan layanan worker
Saat tugas dikeluarkan dari antreannya, layanan Task Queue akan mengirimkannya ke layanan worker. Setiap tugas memiliki target dan url, yang menentukan layanan dan pengendali yang nantinya akan menjalankan tugas.
target
Target tersebut menentukan layanan yang akan menerima permintaan HTTP untuk menjalankan tugas. Ini adalah string yang menentukan layanan/versi/instance dalam salah satu formulir kanonis. Bentuk yang paling sering digunakan adalah:
service
version.service
instance.version.service
String target ditambahkan ke nama domain aplikasi Anda. Ada tiga cara menetapkan target untuk tugas:
Deklarasikan target saat Anda membuat tugas. Anda dapat menetapkan target secara eksplisit menggunakan parameter
target
dalam fungsi taskqueue.add(). Lihat contoh di atas.Sertakan perintah
target
saat Anda menentukan antrean diqueue.yaml
, sesuai dengan definisiqueue-blue
. Semua tugas yang ditambahkan ke antrean dengantarget
akan menggunakan target tersebut, meskipun target yang berbeda ditetapkan ke tugas tersebut saat proses pembuatan.Jika tidak ada target yang ditentukan berdasarkan salah satu dari dua metode sebelumnya, target tugas adalah versi layanan yang mengantrekannya. Perhatikan bahwa jika Anda mengantrekan tugas dari layanan dan versi default dengan cara ini, dan versi default berubah sebelum tugas dijalankan, tugas tersebut akan berjalan dalam versi default yang baru.
url
url
memilih salah satu pengendali dalam layanan target, yang akan menjalankan tugas.
url
harus cocok dengan salah satu pola URL pengendali di layanan target. url
dapat menyertakan parameter kueri jika metode yang ditentukan dalam tugas adalah GET
atau PULL
. Jika url
tidak ditentukan, URL default /_ah/queue/[QUEUE_NAME]
akan digunakan, dengan [QUEUE_NAME]
sebagai nama antrean tugas.
Meneruskan data ke pengendali
Anda dapat meneruskan data ke pengendali sebagai parameter kueri di URL tugas, tetapi
hanya jika metode yang ditentukan dalam tugas adalah GET
atau PULL
.
payload
, yang mengirimkan data tugas dalam isi permintaan HTTP.params
Ketiga panggilan ini setara:
taskqueue.add(method=GET, url='/update-counter?key=blue', target='worker')
taskqueue.add(url='/update-counter', params={'key': 'blue'}, target='worker')
taskqueue.add(url='/update-counter', payload="{'key': 'blue'}", target='worker')
Menamai tugas
Saat Anda membuat tugas baru, App Engine akan menetapkan nama yang unik pada tugas tersebut secara default. Namun, Anda dapat menetapkan nama Anda sendiri untuk tugas menggunakan parameter name
. Keuntungan menetapkan nama tugas sendiri adalah tugas yang dinamai sendiri akan dihapus duplikatnya. Artinya, Anda dapat menggunakan nama tugas untuk menjamin bahwa tugas hanya ditambahkan sekali. Penghapusan duplikat akan berlanjut selama 9 hari setelah tugas diselesaikan atau dihapus.
Perlu diperhatikan bahwa logika penghapusan duplikat menimbulkan beban performa yang signifikan, sehingga mengakibatkan peningkatan latensi dan berpotensi meningkatkan tingkat error yang terkait dengan tugas bernama. Biaya ini dapat meningkat secara signifikan jika nama tugas berurutan, seperti dengan stempel waktu. Jadi, jika Anda menetapkan nama Anda sendiri, sebaiknya gunakan imbuhan yang didistribusikan dengan baik untuk nama tugas, seperti hash konten.
Jika Anda menetapkan sendiri nama tugas, perhatikan bahwa panjang nama maksimum adalah 500 karakter dan berisi huruf besar dan kecil, angka garis bawah, dan tanda hubung.
taskqueue.add(url='/url/path', name='first-try')
Menambahkan tugas secara asinkron
Secara default, panggilan yang menambahkan tugas ke antrean akan bersifat sinkron. Untuk sebagian besar skenario, panggilan sinkron berfungsi dengan baik. Menambahkan tugas ke antrean biasanya merupakan operasi yang cepat. Ada sebagian kecil operasi penambahan tugas yang dapat memerlukan waktu yang jauh lebih lama, tetapi waktu median untuk menambahkan tugas kurang dari 5 milidetik.
Operasi tambahkan tugas ke antrean yang berbeda tidak dapat dilakukan dalam batch, sehingga Task Queue API juga menyediakan panggilan asinkron yang memberi Anda kemampuan untuk menambahkan tugas ini secara paralel, sehingga semakin meminimalkan latensi ini. Hal ini berguna jika Anda membangun aplikasi yang sangat sensitif terhadap latensi, dan perlu melakukan beberapa operasi tambahkan tugas ke antrean yang berbeda secara bersamaan.
Jika ingin melakukan panggilan asinkron ke task queue, gunakan metode
asinkron yang disediakan oleh
class Queue dan
objek RPC. Panggil get_result()
pada
objek RPC
yang ditampilkan untuk memaksa permintaan diselesaikan. Saat menambahkan
tugas secara asinkron dalam transaksi, Anda harus memanggil get_result()
pada objek
RPC
sebelum melakukan transaksi untuk memastikan bahwa permintaan telah selesai
.
Menambahkan tugas ke dalam antrean di transaksi Cloud Datastore
Anda dapat menambahkan tugas ke dalam antrean sebagai bagian dari transaksi Datastore, sehingga tugas tersebut hanya diantrekan—dan dijamin diantrekan—jika transaksi berhasil di-commit. Tugas yang ditambahkan ke transaksi dianggap sebagai bagian darinya dan memiliki tingkat isolasi dan konsistensi yang sama.
Aplikasi tidak dapat memasukkan lebih dari lima tugas transaksi ke task queue pada satu transaksi. Tugas transaksi tidak boleh menggunakan nama yang ditentukan pengguna.
Contoh kode berikut menunjukkan cara memasukkan tugas transaksi ke push queue sebagai bagian dari transaksi Datastore:
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
@ndb.transactional
def do_something_in_transaction():
taskqueue.add(url='/path/to/my/worker', transactional=True)
#...
do_something_in_transaction()
Menggunakan library tugas yang ditangguhkan, sebagai ganti layanan worker
Menyiapkan pengendali untuk setiap tugas yang berbeda (seperti yang dijelaskan di bagian
sebelumnya) bisa jadi cukup rumit, karena proses serialisasi dan deserialisasi argumen
yang kompleks untuk tugas tersebut dapat menjadi hal yang rumit—terutama jika ada
banyak variasi tugas kecil yang ingin Anda jalankan pada antrean. Python SDK menyertakan library
(google.appengine.ext.deferred
) yang mengekspos fungsi sederhana sehingga Anda dapat
mengabaikan semua tugas penyiapan pengendali tugas khusus serta membuat serialisasi dan
deserialisasi parameter.
Untuk menggunakan library ini, Anda perlu menambahkan deferred
bawaan ke app.yaml
. Untuk
mengetahui informasi selengkapnya, lihat
bagian Pengendali Bawaan
dalam referensi app.yaml
.
Untuk menggunakan library deferred
, cukup teruskan fungsi dan argumennya ke
deferred.defer()
:
import logging
from google.appengine.ext import deferred
def do_something_expensive(a, b, c=None):
logging.info("Doing something expensive!")
# Do your work here
# Somewhere else
deferred.defer(do_something_expensive, "Hello, world!", 42, True)
Library deferred
mengemas panggilan fungsi Anda dan argumennya, lalu
menambahkannya ke task queue. Saat tugas dieksekusi, library deferred
akan mengeksekusi
do_something_expensive("Hello, world!", 42, True)
.
Bekerja dengan tugas di aplikasi multi-tenant
Secara default, push queue menggunakan namespace saat ini seperti yang ditetapkan dalam pengelola namespace pada saat tugas dibuat. Jika aplikasi Anda menggunakan multitenancy, lihat Namespace Python 2 API.
Langkah selanjutnya
- Pelajari cara membuat pengendali tugas.