Task Prioritization in Queue (Priority Queue)

Task Prioritization in Queue (Priority Queue)

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1281
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1237
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    977
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    1027
  • image_website-sbh_0.webp
    Website development for SBH Partners
    1103
  • image_website-_0.webp
    Website development for Red Pear
    550

Task Prioritization in Queue (Priority Queue)

Imagine: 90% of users leave your site if the password reset email doesn't arrive within 5 seconds. But your queue is clogged with 30-minute reports. Result — lost clients and negative feedback. We faced this in a project with 150,000 active users: critical tasks (password reset, SMS codes) were in the same queue as exports. After implementing prioritization, latency for critical tasks dropped from 30 seconds to 2 seconds — 15x faster. Cost savings: setup starts at $500, and clients typically see ROI within a month. Below is how we do it.

With 5+ years of queue work and over 50 projects, from startups to enterprise, our approach is to design a priority model, configure workers, and protect the system from starvation. No unnecessary abstractions, only proven patterns.

Why Queue Prioritization Is Critical for Performance?

Without prioritization, all tasks are processed in FIFO order. This causes unacceptable delays for critical operations. For example, in a high-traffic project, every 100ms of latency reduces conversion by 7%. Our clients see an 80–95% reduction in critical task response time after prioritization. Dedicated workers perform 10x better than soft priority under high load.

Priority Model

Typical three-level split:

Queue Tasks Acceptable Wait
critical Password reset, SMS codes, payment notifications < 5 seconds
default Transactional emails, notifications < 30 seconds
low Reports, exports, mailings, indexing minutes/hours

The choice of levels depends on your business SLA. For an e-commerce store, you may add a high queue for orders. In production, we maintain critical queue depth below 10, while low queue can grow to 5000 but is processed in background.

How to Set Up Priorities in Laravel?

Laravel supports soft priority: the worker iterates queues in the specified order. Command:

php artisan queue:work --queue=critical,default,low 

If there are tasks in critical, the worker does not move to default. Priority is set at dispatch:

SendPasswordResetEmail::dispatch($user)->onQueue('critical'); 

Or inside the Job via the $queue property. This is simple and fast, but with long tasks in the low queue, critical tasks may wait. Solution — dedicated Horizon workers.

Comparison of Soft Priority and Dedicated Workers

Parameter Soft Priority Dedicated Workers (Horizon)
Latency for critical Can reach minutes Guaranteed < 5 seconds
Configuration One worker Supervisor per queue
Starvation risk High under load Minimal
Resources More economical Requires more processes

How to Use Dedicated Workers for Critical Tasks?

Horizon allows creating separate worker pools for each queue. Compare: soft priority — critical latency can reach minutes when low queue is loaded. Dedicated workers guarantee < 5 seconds — 10x faster. Example configuration:

// config/horizon.php 'environments' => [ 'production' => [ 'critical-supervisor' => [ 'connection' => 'redis', 'queue' => ['critical'], 'balance' => 'simple', 'minProcesses' => 2, 'maxProcesses' => 8, 'timeout' => 30, ], 'default-supervisor' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'minProcesses' => 1, 'maxProcesses' => 5, 'timeout' => 60, ], 'low-supervisor' => [ 'connection' => 'redis', 'queue' => ['low'], 'balance' => 'simple', 'processes' => 2, 'timeout' => 3600, ], ], ], 

Each supervisor works independently: critical is not blocked by low tasks. This is a standard pattern for high-traffic projects.

What Is Starvation and How to Prevent It?

Starvation — low-priority tasks never get processed due to a constant influx of critical ones. This leads to endless accumulation of reports and exports. Two main solutions:

Aging — increase priority over time. Implement via scheduled job:

// Increase priority of tasks waiting more than 30 minutes Schedule::call(function () { Job::where('queue', 'low') ->where('created_at', '<', now()->subMinutes(30)) ->update(['queue' => 'default']); })->everyFifteenMinutes(); 

Dedicated worker for low — one process guarantees that low tasks will eventually run. Combining both methods gives 100% protection.

Dynamic Priority Based on Data

Priority can be assigned dynamically based on the user. For example, enterprise clients get critical priority, ordinary users get default. This is more flexible than a static scheme and saves resources.

Priority in BullMQ (Node.js)

BullMQ uses numeric priorities via Redis Sorted Set. This is more precise than Laravel but requires separate infrastructure.

await queue.add('send-password-reset', { userId: 123 }, { priority: 1 }); await queue.add('generate-report', { reportId: 789 }, { priority: 10 }); 

The lower the number, the higher the priority. In Laravel it's simpler if your stack is already PHP.

Monitoring and Alerting

Queue depth is tracked via Redis: Redis::llen('queues:critical'). Horizon displays this in its dashboard. We set up alerts for queue growth — a sign of insufficient workers. Recommended thresholds: if critical > 50, default > 200, or low > 1000 — immediate notification. This prevents downtime.

What Is Included

  1. Audit of current queue architecture
  2. Designing priority model with SLA
  3. Configuration of workers (Horizon or BullMQ)
  4. Starvation prevention (aging + dedicated worker)
  5. Monitoring and documentation of the setup
  6. Access to monitoring dashboards
  7. Team training (2-hour session)
  8. 30 days of support

Timeline: basic setup of three queues — 3 to 5 hours. Anti-starvation logic and monitoring — additional 2 to 4 hours. Cost is calculated individually starting from $500 for basic setup.

Get a turnkey solution in 3–5 hours—write to us for a free stack evaluation. Order queue setup and receive a consultation for your stack.

Learn more about Laravel Horizon (official documentation)