اولویت وزن دار

به طور پیش‌فرض، Server یک صف به نام "default" برای پردازش تمامی وظایف ایجاد می‌کند.

اگر نیاز به اختصاص اولویت به هر وظیفه دارید، می‌توانید چندین صف با اولویت‌های مختلف ایجاد کنید.

مثال:

srv := asynq.NewServer(redis, asynq.Config{
    Concurrency: 10,
    Queues: map[string]int{
        "critical": 6,
        "default":  3,
        "low":      1,
    },
})

این دستور یک نمونه از Background با سه صف ایجاد می‌کند: critical, default, و low. اعداد مرتبط با نام‌های صف، سطح اولویت صف‌ها را نمایندگی می‌کنند.

بر اساس پیکربندی فوق:

  • وظایف موجود در صف critical 60 درصد از زمان پردازش خواهند شد
  • وظایف موجود در صف default 30 درصد از زمان پردازش خواهند شد
  • وظایف موجود در صف low 10 درصد از زمان پردازش خواهند شد

اکنون که دارای چندین صف با سطوح اولویت مختلف هستیم، می‌توانیم مشخص کنیم که وظایف را زمان زمان زمان زمان زمان زمان.

مثال:

client := asynq.NewClient(redis)
task := asynq.NewTask("send_notification", map[string]interface{}{"user_id": 42})

// از گزینه `asynq.Queue` برای مشخص کردن استفاده از صف "critical" در برنامه‌ریزی وظیفه استفاده کنید.
err := client.Enqueue(task, asynq.Queue("critical"))

// به طور پیش‌فرض، وظایف به صف "default" اضافه خواهند شد.
err = client.Enqueue(task)

با استفاده از دستور asynq stats، می‌توانیم صف‌ها را بررسی کنیم.

می‌توانید تعداد وظایف موجود در هر صف را در بخش "صفوف" خروجی مشاهده کنید.

اولویت سخت

اگر نیاز به ایجاد چندین صف و تمام وظایف موجود در یک صف با اولویت بالاتر پردازش شوند، می‌توانید از گزینه StrictPriority استفاده کنید.

مثال:

srv := asynq.NewServer(redis, asynq.Config{
    Concurrency: 10,
    Queues: map[string]int{
        "critical": 3,
        "default":  2,
        "low":      1,
    },
    StrictPriority: true, // حالت سخت!
})

این دستور یک نمونه از Background با سه صف و اولویت سخت ایجاد می‌کند: critical, default, و low. در حالت اولویت سخت، صف‌های با اولویت بالاتر همیشه اولین خواهند بود که پردازش می‌شوند و صف‌های با اولویت پایین‌تر فقط در صورت خالی بودن تمامی صف‌های با اولویت بالاتر پردازش خواهند شد.

بنابراین، در این مثال، وظایف موجود در صف critical همیشه اولین بار پردازش خواهند شد. اگر صف critical خالی باشد، صف default پردازش خواهد شد. اگر هر دو صف critical و default خالی باشند، صف low پردازش خواهد شد.