ภาพรวม
คุณสามารถให้ 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