หน้านี้อธิบายการกำหนดค่าการลองทำงานงาน
พฤติกรรมเริ่มต้น
ตามขั้นตอนเริ่มต้น asynq
จะลองทำงานงานสูงสุด 25 ครั้ง ทุกครั้งที่ทำงานถูกลองทำใหม่ จะใช้กลยุทธ์การหน่วงกลับเพื่อคำนวณค่าหน่วงกลับ หากงานโดนลองทำสำเร็จทั้งหมด (ค่าเริ่มต้นคือ 25 ครั้ง) งานจะถูกย้ายไปยังสถานะ เก็บเข้า เพื่อวัตถุประสงค์ในการซ่อมแซมและการตรวจสอบ และจะไม่ได้ทำงานที่ถูกลองทำอัตโนมัติ (คุณยังคงสามารถสั่งให้ทำงานที่ถูกลองทำโดยใช้ CLI หรือ WebUI)
ส่วนที่เหลือของหน้านี้อธิบายคุณสมบัติการลองทำงานงานที่กำหนดเอง
การกำหนดค่าการลองทำงานสูงสุดสำหรับงาน
คุณสามารถระบุจำนวนครั้งที่ทำงานถูกลองทำใหม่สูงสุดสำหรับงานเมื่อนำมาเข้าคิวใช้ asynq.MaxRetry
option
ตัวอย่าง:
client.Enqueue(task, asynq.MaxRetry(5))
นี่บ่งชี้ว่า task
ควรถูกลองทำใหม่สูงสุด 5 ครั้ง
หรือถ้าคุณต้องการกำหนดค่าการลองทำงานสูงสุดสำหรับงานแต่ละงานคุณสามารถกำหนดค่าไว้เป็นค่าเริ่มต้นสำหรับงาน
task := asynq.NewTask("feed:import", nil, asynq.MaxRetry(5))
client.Enqueue(task) // MaxRetry set to 5
การกำหนดค่าการลองทำงานใหม่
คุณสามารถระบุว่าจะคำนวณค่าหน่วงกลับอย่างไรโดยใช้ RetryDelayFunc
option ในโครงสร้าง Config
ลายเซ็นของ RetryDelayFunc
คือ ดังนี้:
// n คือ จำนวนครั้งที่งานถูกลองทำใหม่
// e คือ ความผิดพลาดที่รีเทิร์นกลับจากตัวควบคุมงาน
// t คือ งานที่เกี่ยวข้อง
RetryDelayFunc func(n int, e error, t *asynq.Task) time.Duration
ตัวอย่าง:
srv := asynq.NewServer(redis, asynq.Config{
Concurrency: 20,
RetryDelayFunc: func(n int, e error, t *asynq.Task) time.Duration {
return 2 * time.Second
},
})
นี่บ่งชี้ว่างานที่ล้มเหลวทั้งหมดจะรออยู่สองวินาทีก่อนที่จะถูกประมวลผลอีกครั้ง
พฤติกรรมเริ่มต้นคือย้อนกลับทางปริมาณ กำหนดโดย DefaultRetryDelayFunc
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าจะกำหนดค่าหน่วงกลับแก่ชนิดงานที่ระบุเอง:
srv := asynq.NewServer(redis, asynq.Config{
// สำหรับงาน "foo" เสมอให้ใช้ค่าหน่วงกลับ 2 วินาที, งานอื่น ๆ ใช้พฤติกรรมเริ่มต้น
RetryDelayFunc: func(n int, e error, t *asynq.Task) time.Duration {
if t.Type() == "foo" {
return 2 * time.Second
}
return asynq.DefaultRetryDelayFunc(n, e, t)
},
})
คำสั่งทำงานล้มเหลว
บางครั้งคุณอาจต้องการที่จะส่งคืนค่าความผิดพลาดจากตัวควบคุมงานและลองทำงานงานภายหลัง แต่ไม่ต้องการใช้จำนวนครั้งที่ลองทำงานงาน ตัวอย่างเช่น คุณอาจต้องการลองทำงานภายหลังเพราะหน่วยงานทำงานไม่มีทรัพยากรความจำเป็นที่เพียงพอต่อการจัดการงาน
ขณะเริ่มต้นเซิร์ฟเวอร์คุณสามารถเลือกที่จะให้ Config
สำหรับฟังก์ชันทำนาย IsFailure(error) bool
ฟังก์ชันนี้กำหนดว่าความผิดพลาดจากตัวควบคุมงานนับเป็นล้มเหลวหรือไม่ หากฟังก์ชันนี้คืนค่าเป็นเท็จ (คือ ความผิดพลาดที่ไม่ล้มเหลว) เซิร์ฟเวอร์จะไม่ใช้จำนวนครั้งที่ลองทำงานงานและเพียงแค่ตั้งตารางการทำงานใหม่สำหรับลองทำงานภายหลัง
ตัวอย่าง:
var ErrResourceNotAvailable = errors.New("no resource is available")
func HandleResourceIntensiveTask(ctx context.Context, task *asynq.Task) error {
if !IsResourceAvailable() {
return ErrResourceNotAvailable
}
// ... logic for handling resource-intensive task
}
// ...
srv := asynq.NewServer(redisConnOpt, asynq.Config{
// ... other configuration options
IsFailure: func(err error) bool {
return err != ErrResourceNotAvailable // non-failure error if no resource is available
},
})
ข้ามการลองทำงาน
หาก Handler.ProcessTask
ส่งคืนค่าของ SkipRetry
คืนค่าของ SkipRetry
หรือความผิดพลาดที่ครอบด้วยของ SkipRetry
งานจะถูกเก็บเข้าไม่ว่าจะขาดเหลือจำนวนครั้งที่ลองทำงานอยู่เท่าใด
func ExampleHandler(ctx context.Context, task *asynq.Task) error {
// ตรรกะการจัดการงานที่นี่...
// หากตัวควบคุมรู้ว่างานไม่ควรถูกลองทำงานอีก ส่งคืนค่าของ SkipRetry
return fmt.Errorf(": %w", asynq.SkipRetry)
}