หน้านี้อธิบายการกำหนดค่าการลองทำงานงาน

พฤติกรรมเริ่มต้น

ตามขั้นตอนเริ่มต้น 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)
}