Genel Bakış

Sunucu ile eş zamanlı olarak Zamanlayıcıyı çalıştırarak görevleri periyodik olarak yönetebilirsiniz. Zamanlayıcı periyodik olarak görevleri kuyruğa ekleyecek ve ardından kümedeki uygun sunucular tarafından yürütülecektir.

Her zamanlama için yalnızca bir Zamanlayıcının çalıştığından emin olmalısınız, böylece çift görevlerden kaçınılır. Merkezi bir yaklaşım kullanmak, senkronizasyon gerektirmediği anlamına gelir ve hizmet kilitler kullanmadan çalışabilir.

Dinamik olarak periyodik görevler eklemek ve kaldırmak istiyorsanız, ZamanlanmışGörevYöneticisini doğrudan Zamanlayıcıyı kullanmak yerine kullanın. Daha detaylı bilgi için bu wikiye göz atın.

Zaman Dilimi

Varsayılan olarak periyodik görevler, UTC zamanını kullanır, ancak ZamanlayıcıSeçeneklerini kullanarak kullanılan zaman dilimini değiştirebilirsiniz.

// Örneğin, varsayılan UTC zaman dilimi yerine America/Los_Angeles zaman dilimini kullanın.
loc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
    panic(err)
}
scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        Konum: loc,
    },
)

Görev Kaydı

Periyodik olarak görevleri kuyruğa eklemek için, Zamanlayıcıyla bir görev kaydı kaydetmeniz gerekir.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

görev := asynq.NewTask("örnek_görev", nil)

// Zamanlama belirtimi dizgesini belirtmek için bir cron belirtimi dizgesi kullanabilirsiniz.
entryID, err := scheduler.Kaydet("* * * * *", görev)
if err != nil {
    log.Fatal(err)
}
log.Printf("bir giriş kaydedildi: %q\n", entryID)

// Ayrıca aralıkları belirtmek için "@every " kullanabilirsiniz.
entryID, err = scheduler.Kaydet("@every 30s", görev)
if err != nil {
    log.Fatal(err)
}
log.Printf("bir giriş kaydedildi: %q\n", entryID)

// Ayrıca seçenekler geçirebilirsiniz.
entryID, err = scheduler.Kaydet("@every 24saat", görev, asynq.Kuyruk("benimkuyruk"))
if err != nil {
    log.Fatal(err)
}
log.Printf("bir giriş kaydedildi: %q\n", entryID)

Zamanlayıcıyı Çalıştırma

Zamanlayıcıyı başlatmak için, Zamanlayıcı üzerinde Çalıştırı çağırın.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

// ... Görevleri Kaydet

if err := scheduler.Çalıştır(); err != nil {
    log.Fatal(err)
}

Çalıştırı çağırmak TERM veya INT sinyalini (örneğin, Ctrl-C) bekleyecektir.

Hata İşleme

Zamanlayıcı görevleri kuyruğa eklemekte başarısız olursa hataları işlemek için bir işleyici işlevi sağlayabilirsiniz.

func görevEklenirkenHataİşle(task *asynq.Task, opts []asynq.Seçenek, err error) {
    // Hata işleme mantığınız
}

scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        GörevEklemeHataİşleyici: görevEklenirkenHataİşle,
    },
)

CLI Üzerinden Kontrol Etme

CLI'nin cron adında Zamanlayıcı kayıtlarını kontrol etmek için bir alt komutu bulunmaktadır.

Şu anda çalışan Zamanlayıcı için tüm kayıtları görmek için aşağıdaki komutu çalıştırabilirsiniz:

asynq cron ls

Bu komut, her kayıt için ID, zamanlama belirtimi, bir sonraki kuyruğa ekleme zamanı ve son kuyruğa ekleme zamanını içeren bir liste çıktılar.

Ayrıca her kaydın geçmişini görmek için aşağıdaki komutu çalıştırabilirsiniz:

asynq cron geçmiş