ภาพรวม

คุณสามารถให้ Scheduler ทำงานพร้อมกับ Server ในขณะเดียวกันเพื่อจัดการงานตามระยะเวลาอย่างสม่ำเสมอ โดย Scheduler จะเพิ่มงานลงในคิวตามระยะเวลาอย่างสม่ำเสมอ ซึ่งจะถูกดำเนินการโดยเซิร์ฟเวอร์ทำงานที่พร้อมในคลัสเตอร์

คุณต้องให้แน่ใจว่ามีเพียงหนึ่ง Scheduler ที่ทำงานสำหรับแต่ละกำหนดเวลาเพื่อป้องกันการทำงานซ้ำซ้อน การใช้อิสระจัดการหมายถึงที่จะไม่จำเป็นต้องซิงโครไนส์และบริการสามารถทำงานได้โดยไม่ต้องใช้อุปกรณ์ล็อค

หากคุณต้องการเพิ่มและลบงานตามระยะเวลาอย่างสม่ำเสมอไปดูไฟล์ วิกิ นี้สำหรับข้อมูลที่มีรายละเอียดมากยิ่งกว่า

โซนเวลา

ตามค่าเริ่มต้น งานที่เกิดขึ้นเป็นระยะเวลาอย่างสม่ำเสมอจะใช้โซนเวลา UTC แต่คุณสามารถใช้ SchedulerOpts เพื่อเปลี่ยนโซนเวลาที่ใช้

// ตัวอย่างเช่น ใช้โซนเวลา America/Los_Angeles แทนที่โซนเวลา UTC เริ่มต้น
loc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
    panic(err)
}
scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        Location: loc,
    },
)

การลงทะเบียนงาน

เพื่อเพิ่มงานอย่างสม่ำเสมอเข้าในคิว คุณต้องลงทะเบียนตารางงานกับ Scheduler

scheduler := asynq.NewScheduler(redisConnOpt, nil)

task := asynq.NewTask("example_task", nil)

// คุณสามารถใช้สายการตั้งเวลา cron เพื่อระบุตารางเวลา
entryID, err := scheduler.Register("* * * * *", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("ลงทะเบียนแอนทรี: %q\n", entryID)

// คุณยังสามารถใช้ "@every " เพื่อระบุระยะเวลา
entryID, err = scheduler.Register("@every 30s", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("ลงทะเบียนแอนทรี: %q\n", entryID)

// คุณยังสามารถส่งออปชันได้อีก
entryID, err = scheduler.Register("@every 24h", task, asynq.Queue("myqueue"))
if err != nil {
    log.Fatal(err)
}
log.Printf("ลงทะเบียนแอนทรี: %q\n", entryID)

การเริ่มต้น Scheduler

เรียก Run บน Scheduler เพื่อเริ่มต้นการทำงาน

scheduler := asynq.NewScheduler(redisConnOpt, nil)

// ... ลงทะเบียนงาน

if err := scheduler.Run(); err != nil {
    log.Fatal(err)
}

การเรียก Run จะรอสัญญาณ TERM หรือ INT (เช่น การกด Ctrl-C)

การจัดการข้อผิดพลาด

คุณสามารถระบุฟังก์ชันที่จะจัดการกับข้อผิดพลาดหาก Scheduler ไม่สามารถเพิ่มงานเข้าในคิว

func handleEnqueueError(task *asynq.Task, opts []asynq.Option, err error) {
    // ตรรกะการจัดการข้อผิดพลาดของคุณ
}

scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        EnqueueErrorHandler: handleEnqueueError,
    },
)

การตรวจสอบผ่าน CLI

CLI มีคำสั่งย่อยที่ชื่อ cron เพื่อตรวจสอบบันทึก Scheduler

เพื่อดูบันทึกทั้งหมดสำหรับ Scheduler ที่ทำงานอยู่ในปัจจุบัน คุณสามารถรันคำสั่งต่อไปนี้:

asynq cron ls

คำสั่งนี้จะแสดงรายการที่มีประกอบด้วย ID, ตารางเวลา, เวลาเปิดทำงานครั้งต่อไป และเวลาล่าสุดที่ทำงานสำหรับแต่ละบันทึก

คุณยังสามารถรันคำสั่งต่อไปนี้เพื่อดูประวัติของแต่ละบันทึก:

asynq cron history