Asynq'da Benzersiz Görev Özelliği, Redis sırasında yalnızca bir görev olduğunu sağlar.

Görevleri tekilleştirmek ve yinelenen görevlerden kaçınmak istediğinizde, bu özellik çok kullanışlıdır.

Genel Bakış

Asynq'da görevin benzersizliğini sağlamak için iki yöntem bulunmaktadır.

  1. TaskID seçeneğini kullanma: Kendiniz benzersiz bir görev kimliği oluşturun.
  2. Unique seçeneğini kullanma: Asynq, görev için benzersizlik kilidi oluşturmasına izin verin.

TaskID Seçeneğini Kullanma

Eğer ilk yöntemi seçerseniz, belirli bir görev kimliğine sahip yalnızca bir görevin herhangi bir zamanda olduğundan emin olabilirsiniz. Aynı görev kimliği ile başka bir görevi sıraya koymaya çalışırsanız, ErrTaskIDConflict hatası alırsınız.

// İlk görev sorunsuz olmalı
_, err := client.Enqueue(task, asynq.TaskID("mytaskid"))

// İkinci görev başarısız olacak, err değeri ErrTaskIDConflict olacaktır (varsayılan olarak ilk görev henüz işlenmemişse)
_, err = client.Enqueue(task, asynq.TaskID("mytaskid"))

Unique Seçeneğini Kullanma

İkinci yöntem, benzersizlik kilidine dayanmaktadır. Unique seçeneğini kullanarak bir görevi sıraya koyarken, Client, verilen görev için kilidin alınabilir olup olmadığını kontrol eder. Görev, sadece kilidin alınabileceği durumda sıraya koyulur. Eğer başka bir görev zaten kilidi elinde tutuyorsa, Client bir hata dönecektir (hataları kontrol etmek için aşağıdaki örnek koduna bakınız).

Benzersizlik kilidi, kilidi sürekli olarak tutmamak için bir TTL (yaşam süresi) ile ilişkilidir. Kilidin süresi dolduğunda veya görev TTL'den önce başarıyla işlendiyse, kilidin serbest bırakılacaktır.

Bir diğer önemli nokta ise Asynq'daki benzersiz görev özelliğinin en iyi çaba benzersizliği olduğudur. Başka bir deyişle, kilidin süresi görev işlenmeden önce dolduysa, yinelenen bir görev sıraya alınabilir.

Görevin benzersizliği, aşağıdaki özelliklere dayanmaktadır:

  • Tür
  • Taşıma
  • Sıra

Bu nedenle, aynı tipe ve taşıma sahip görevlerin aynı sıraya alındığı durumda, kilidin serbest bırakılana kadar başka bir görev aynı özelliklere sahip olmayacaktır.

c := asynq.NewClient(redis)

t1 := asynq.NewTask("örnek", []byte("merhaba"))

// t1 bir sonraki saat boyunca benzersizlik kilidini tutacaktır.
err := c.Enqueue(t1, asynq.Unique(time.Hour))
switch {
case errors.Is(err, asynq.ErrDuplicateTask):
    // Yineleyen görevi işleyin
case err != nil:
    // Diğer hataları işleyin
}

t2 := asynq.NewTask("örnek", []byte("merhaba"))

// t2, t1'in bir yinelemesi olduğu için sıraya alınamaz.
err = c.Enqueue(t2, asynq.Unique(time.Hour))
switch {
case errors.Is(err, asynq.ErrDuplicateTask):
    // Yineleyen görevi işleyin
case err != nil:
    // Diğer hataları işleyin
}

Yukarıdaki örnekte, t2, t1'in bir yinelemesi olduğu için sıraya alınamaz. Dönen error değerini kontrol etmek için errors.Is kullanabilirsiniz.