Queue System
The Volare application implements a robust queue infrastructure for handling asynchronous tasks using PostgreSQL for development and Amazon SQS for production.
Overview
Section titled “Overview”Key Features:
- Database-driven queues for development (PostgreSQL)
- Automatic worker management via Docker Compose
- Production-ready configuration for Amazon SQS
- Built-in monitoring and debugging commands
- Graceful restarts and failure handling
Architecture
Section titled “Architecture”Components
Section titled “Components”Application Code -> Queue Connection -> PostgreSQL Jobs Table | v Queue Worker Container -> Job Handler -> Success/FailureInfrastructure
Section titled “Infrastructure”Development Environment:
- Queue Driver: PostgreSQL database driver
- Worker Process: Dedicated Docker container (
queueservice) - Management: Docker Compose (no Supervisor needed)
- Persistence: Database tables (
jobs,failed_jobs,job_batches)
Production Environment:
- Queue Driver: Amazon SQS
- Worker Process: EC2 instances or ECS containers
- Management: AWS infrastructure
Queue Priority
Section titled “Queue Priority”The worker processes queues in priority order:
aerticket-tickets- Ticket issuance (highest priority)aerticket-bookings- Booking creationdefault- General tasks
Quick Start
Section titled “Quick Start”Dispatching Jobs
Section titled “Dispatching Jobs”use App\Jobs\TestQueueJob;
// Simple dispatchTestQueueJob::dispatch('Hello, Queue!');
// Delayed dispatch (5 minutes)TestQueueJob::dispatch('Delayed message') ->delay(now()->addMinutes(5));
// Custom queueTestQueueJob::dispatch('High priority') ->onQueue('high-priority');Monitoring
Section titled “Monitoring”# Check queue status./vendor/bin/sail artisan queue:monitor
# Watch logs in real-time./vendor/bin/sail artisan tail
# Check failed jobs./vendor/bin/sail artisan queue:failedConfiguration
Section titled “Configuration”Environment Variables
Section titled “Environment Variables”# Queue driver: database (dev) or sqs (production)QUEUE_CONNECTION=database
# Database queue settingsDB_QUEUE_CONNECTION=pgsqlDB_QUEUE_TABLE=jobsDB_QUEUE=defaultDB_QUEUE_RETRY_AFTER=90
# Job retry settingsQUEUE_RETRY_AFTER=90QUEUE_MAX_ATTEMPTS=3Docker Compose Configuration
Section titled “Docker Compose Configuration”queue: build: context: './vendor/laravel/sail/runtimes/8.4' dockerfile: Dockerfile volumes: - '.:/var/www/html' networks: - sail depends_on: - pgsql - redis command: php artisan queue:work --queue=aerticket-tickets,aerticket-bookings,default --sleep=3 --tries=3 --max-time=3600Worker Behavior:
- Polls every 3 seconds for new jobs
- Max 3 retry attempts per job
- Max 1 hour runtime before graceful restart
- Auto-restart on container failure
Common Operations
Section titled “Common Operations”Restarting Workers
Section titled “Restarting Workers”# Signal workers to restart after current job./vendor/bin/sail artisan queue:restart
# Or restart the Docker container./vendor/bin/sail restart queueHandling Failed Jobs
Section titled “Handling Failed Jobs”# List all failed jobs./vendor/bin/sail artisan queue:failed
# Retry a specific failed job./vendor/bin/sail artisan queue:retry {job_id}
# Retry all failed jobs./vendor/bin/sail artisan queue:retry all
# Flush all failed jobs./vendor/bin/sail artisan queue:flushMonitoring Workers
Section titled “Monitoring Workers”# Check worker statusdocker ps | grep queue
# View worker logs./vendor/bin/sail logs queue
# Follow worker logs in real-time./vendor/bin/sail logs -f queueAerTicket Queue Jobs
Section titled “AerTicket Queue Jobs”Ticket Issuance Queue
Section titled “Ticket Issuance Queue”Queue Name: aerticket-tickets
Purpose: Process ticket issuance requests with highest priority
Jobs:
AerticketIssueTicketJob- Issues tickets for confirmed bookings
Configuration:
public int $tries = 3;public int $timeout = 120;public array $backoff = [30, 60, 180];Booking Creation Queue
Section titled “Booking Creation Queue”Queue Name: aerticket-bookings
Purpose: Process flight booking creation asynchronously
Jobs:
AerticketCreateBookingJob- Creates flight bookingsAerticketRetrieveBookingJob- Retrieves PNR details
Security Best Practices
Section titled “Security Best Practices”Validate Job Data
Section titled “Validate Job Data”public function __construct( public int $userId, public string $action) { if (!User::find($userId)) { throw new \InvalidArgumentException('Invalid user ID'); }}Encrypt Sensitive Data
Section titled “Encrypt Sensitive Data”use Illuminate\Contracts\Queue\ShouldBeEncrypted;
class ProcessPayment implements ShouldQueue, ShouldBeEncrypted{ public function __construct( public string $creditCardNumber ) {}}Rate Limiting
Section titled “Rate Limiting”use Illuminate\Queue\Middleware\RateLimited;
public function middleware(): array{ return [new RateLimited('api-calls')];}Troubleshooting
Section titled “Troubleshooting”Worker Not Processing Jobs
Section titled “Worker Not Processing Jobs”- Check worker is running:
docker ps | grep queue- Check worker logs:
./vendor/bin/sail logs queue- Restart worker:
./vendor/bin/sail restart queueJobs Failing Repeatedly
Section titled “Jobs Failing Repeatedly”- Check failed job details:
./vendor/bin/sail artisan queue:failed- Review exception:
./vendor/bin/sail artisan tinker>>> DB::table('failed_jobs')->latest()->first()->exception;- Fix issue and retry:
./vendor/bin/sail artisan queue:retry allConnection Timeouts
Section titled “Connection Timeouts”- Increase timeout in job:
public $timeout = 120; // 2 minutes- Increase retry_after:
DB_QUEUE_RETRY_AFTER=180