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.
-
TaskID
seçeneğini kullanma: Kendiniz benzersiz bir görev kimliği oluşturun. -
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.