Batas Waktu Tugas

Pada halaman ini, saya akan memperkenalkan bagaimana cara menetapkan batas waktu atau tenggat waktu untuk tugas, dan bagaimana cara menangani operasi pembatalan.

Saat mengantri tugas menggunakan Client, Anda dapat menentukan Timeout atau Deadline sebagai opsi. Hal ini memungkinkan server untuk mengabaikan tugas dan mereklamasi sumber daya untuk tugas lain jika tugas tersebut tidak diproses sebelum batas waktu atau tenggat waktu.
Opsi ini akan menetapkan batas waktu atau tenggat waktu dari context.Context dan meneruskannya sebagai parameter pertama ke handler Anda.

*Catatan: Batas waktu relatif terhadap saat handler mulai memproses tugas.

Sebagai contoh, jika Anda memiliki tugas yang perlu diselesaikan dalam waktu 30 detik, Anda dapat menetapkan batas waktu sebagai 30 * time.Second.

c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})

err := c.Enqueue(task, asynq.Timeout(30 * time.Second))

Jika Anda memiliki tugas yang perlu diselesaikan pada waktu tertentu, Anda dapat menetapkan tenggat waktu untuk tugas tersebut.
Sebagai contoh, jika Anda memiliki tugas yang perlu diselesaikan sebelum 2020-12-25, Anda dapat meneruskannya sebagai opsi Deadline.

natal := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(natal))

Konteks Tugas dalam Handler

Sekarang setelah kita telah membuat tugas menggunakan opsi Timeout dan Deadline, kita harus menghormati nilai ini dengan membaca saluran Done dalam konteks.

Parameter pertama yang dilewati ke Handler adalah context.Context. Anda harus menulis handler Anda sedemikian rupa sehingga pekerjaan ditinggalkan saat menerima sinyal pembatalan dari konteks.

func myHandler(ctx context.Context, task *asynq.Task) error {
    c := make(chan error, 1)
    go func() {
        c <- doWork(task)
    }()
    select {
    case <-ctx.Done():
        // Sinyal pembatalan diterima, tinggalkan pekerjaan ini.
        return ctx.Err()
    case res := <-c:
        return res
    }   
}

Membatalkan Tugas via CLI

CLI asynq memiliki perintah cancel yang dapat membatalkan ID tugas yang sedang aktif.
Anda dapat menggunakan perintah workers untuk memeriksa tugas yang sedang aktif dan mendapatkan ID tugas yang akan dibatalkan.

asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]