مرور

می‌توانید یک Scheduler را به صورت همزمان با Server اجرا کنید تا وظایف به صورت دوره‌ای را انجام دهد. Scheduler به طور دوره‌ای وظایف را به صف اضافه خواهد کرد که سپس توسط سرورهای کارگر موجود در خوشه اجرا می‌شوند.

برای جلوگیری از ایجاد وظایف تکراری، باید اطمینان حاصل شود که فقط یک Scheduler برای هر زمان بندی در حال اجرا باشد. استفاده از رویکرد متمرکز به معنای عدم نیاز به همگام سازی است و سرویس می‌تواند بدون استفاده از قفل اجرا شود.

اگر نیاز به اضافه کردن و حذف دینامیک وظایف دوره‌ای دارید، از PeriodicTaskManager به جای استفاده مستقیم از 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

برای شروع Scheduler، بر روی آن Run را صدا بزنید.

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,
    },
)

بررسی از طریق خط فرمان

برای بررسی رکوردهای Scheduler، دستور فرعی به نام cron در CLI وجود دارد.

برای مشاهده تمام رکوردهای در حال اجرای Scheduler، می‌توانید دستور زیر را اجرا کنید:

asynq cron ls

این دستور یک لیست شامل شناسه، مشخصه زمان بندی، زمان مورد انتظار برای انتقال بعدی و زمان انتقال اخیر برای هر رکورد خواهد نمود.

همچنین می‌توانید دستور زیر را اجرا کنید تا تاریخچه هر رکورد را مشاهده کنید:

asynq cron history