Queue choice impacts application scalability. Redis suits most applications, Beanstalkd offers dedicated queue management, and SQS integrates with AWS infrastructure. At ZIRA Software, proper queue selection has handled millions of jobs daily.
Queue Drivers Comparison
Redis:
- Easy setup (already used for cache)
- Fast performance
- Suitable for most applications
- Single point of failure without clustering
Beanstalkd:
- Dedicated queue server
- Memory-efficient
- Built for job queuing
- Requires separate service
AWS SQS:
- Fully managed service
- Infinite scalability
- Pay per use
- Cloud-native integration
Redis Queue Setup
Configure Redis:
composer require predis/predis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Create job:
php artisan make:job ProcessOrder
// app/Jobs/ProcessOrder.php
namespace App\Jobs;
use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class ProcessOrder implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $order;
public function __construct(Order $order)
{
$this->order = $order;
}
public function handle()
{
// Process the order
$this->order->process();
// Send confirmation email
\Mail::to($this->order->user)->send(new OrderConfirmation($this->order));
}
}
Dispatch job:
ProcessOrder::dispatch($order);
// Dispatch with delay
ProcessOrder::dispatch($order)->delay(now()->addMinutes(10));
// Dispatch to specific queue
ProcessOrder::dispatch($order)->onQueue('orders');
Beanstalkd Setup
Install Beanstalkd:
# Ubuntu
sudo apt-get install beanstalkd
# macOS
brew install beanstalkd
Configure Laravel:
composer require pda/pheanstalk
QUEUE_CONNECTION=beanstalkd
BEANSTALKD_HOST=127.0.0.1
BEANSTALKD_PORT=11300
Multiple tubes (queues):
// config/queue.php
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => env('BEANSTALKD_HOST', '127.0.0.1'),
'queue' => 'default',
'retry_after' => 90,
],
AWS SQS Setup
Install SQS driver:
composer require aws/aws-sdk-php
Configure credentials:
QUEUE_CONNECTION=sqs
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_DEFAULT_REGION=us-east-1
SQS_PREFIX=https://sqs.us-east-1.amazonaws.com/your-account-id
SQS_QUEUE=default
Configure queue:
// config/queue.php
'sqs' => [
'driver' => 'sqs',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX'),
'queue' => env('SQS_QUEUE', 'default'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
Queue Workers
Run worker:
# Process jobs from default queue
php artisan queue:work
# Process specific queue
php artisan queue:work --queue=high,default
# Process once and exit
php artisan queue:work --once
# Set timeout
php artisan queue:work --timeout=60
Supervisor configuration:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/path/to/worker.log
stopwaitsecs=3600
Job Chaining
ProcessOrder::withChain([
new SendOrderConfirmation($order),
new UpdateInventory($order),
new NotifyShipping($order),
])->dispatch($order);
Failed Jobs
Handle failures:
// app/Jobs/ProcessOrder.php
public function failed(\Exception $exception)
{
// Notify admin
\Mail::to('contact@zirasoftware.com')->send(new JobFailed($this->order, $exception));
}
Retry failed jobs:
# View failed jobs
php artisan queue:failed
# Retry specific job
php artisan queue:retry 5
# Retry all failed
php artisan queue:retry all
Performance Tips
1. Use specific queues:
SendEmail::dispatch($user)->onQueue('emails');
ProcessVideo::dispatch($video)->onQueue('heavy');
2. Optimize serialization:
// Instead of passing entire model
ProcessOrder::dispatch($order); // Bad if order has relations
// Pass ID and fetch in job
ProcessOrder::dispatch($order->id); // Better
3. Job batching:
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
$batch = Bus::batch([
new ProcessOrder($order1),
new ProcessOrder($order2),
new ProcessOrder($order3),
])->dispatch();
Conclusion
Choose Redis for simplicity, Beanstalkd for dedicated queue management, and SQS for AWS-native applications. Proper monitoring and error handling ensure reliability.
Need queue architecture consultation? Contact ZIRA Software for scalable infrastructure design.