مرور
میتوانید یک 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