# Queue Management Guide - viksa2 ## Overview The viksa2 application uses separate queue channels to ensure that different types of jobs don't block each other. This architecture allows heavy, long-running jobs and quick, short-running jobs to execute in parallel without interference. ## Queue Architecture ### Queue Channels We have three separate queue channels configured: 1. **`default`** - General purpose queue for miscellaneous jobs 2. **`register-creator`** - Dedicated queue for RegisterCreatorJob (heavy, long-running operations) 3. **`save-trigger`** - Dedicated queue for ExecuteSaveTriggerJob (quick trigger execution) ### Configuration All queue configurations are defined in `config/queue.php`: ```php 'register-creator' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'register-creator', 'retry_after' => 3600, // 1 hour timeout for long-running operations 'after_commit' => false, ], 'save-trigger' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'save-trigger', 'retry_after' => 90, // 90 seconds for quick trigger execution 'after_commit' => false, ], ``` ## Job Configuration ### RegisterCreatorJob - **Queue**: `register-creator` - **Timeout**: 3600 seconds (1 hour) - **Retry Attempts**: 3 - **Workers**: 2 processes This job handles heavy PDF generation and Excel processing operations. It's configured to run for extended periods without timing out. **Location**: `app/Jobs/RegisterCreatorJob.php` ```php public $queue = 'register-creator'; public int $tries = 3; public int $timeout = 3600; ``` ### ExecuteSaveTriggerJob - **Queue**: `save-trigger` - **Timeout**: 300 seconds (5 minutes) - **Retry Attempts**: 3 - **Workers**: 4 processes This job handles quick database trigger executions. Multiple workers ensure fast processing of trigger operations. **Location**: `app/Jobs/ExecuteSaveTriggerJob.php` ```php public $queue = 'save-trigger'; ``` ## Supervisor Configuration Supervisor manages the queue workers as persistent background processes. The configuration is located at: `/etc/supervisor/conf.d/laravel-worker.conf` ### Worker Processes #### Default Worker ```ini [program:viksa2-worker] command=php /var/www/html/viksa2/artisan queue:work --queue=default numprocs=1 ``` #### Register Creator Worker ```ini [program:viksa2-register-creator] command=php /var/www/html/viksa2/artisan queue:work --queue=register-creator numprocs=2 timeout=3600 ``` - Runs 2 parallel processes - Designed for long-running operations #### Save Trigger Worker ```ini [program:viksa2-save-trigger] command=php /var/www/html/viksa2/artisan queue:work --queue=save-trigger numprocs=4 timeout=300 ``` - Runs 4 parallel processes - Designed for quick execution with high throughput ## Management Commands ### Supervisor Commands ```bash # Reload supervisor configuration sudo supervisorctl reread # Update supervisor with new configuration sudo supervisorctl update # Start all viksa2 workers sudo supervisorctl start viksa2-worker:* sudo supervisorctl start viksa2-register-creator:* sudo supervisorctl start viksa2-save-trigger:* # Stop all viksa2 workers sudo supervisorctl stop viksa2-worker:* sudo supervisorctl stop viksa2-register-creator:* sudo supervisorctl stop viksa2-save-trigger:* # Restart all viksa2 workers sudo supervisorctl restart viksa2-worker:* sudo supervisorctl restart viksa2-register-creator:* sudo supervisorctl restart viksa2-save-trigger:* # Check status sudo supervisorctl status # Restart individual worker group sudo supervisorctl restart viksa2-register-creator:* ``` ### Queue Monitoring ```bash # Monitor queue status php artisan queue:monitor register-creator,save-trigger,default --max=100 # List failed jobs php artisan queue:failed # Retry all failed jobs php artisan queue:retry all # Retry specific failed job php artisan queue:retry {job-id} # Clear all failed jobs php artisan queue:flush # Check queue statistics php artisan queue:work --once --queue=register-creator # Process only one job (useful for testing) php artisan queue:work --once --queue=save-trigger ``` ### Log Monitoring ```bash # Watch register creator worker logs tail -f /var/www/html/viksa2/storage/logs/register-creator-worker.log # Watch save trigger worker logs tail -f /var/www/html/viksa2/storage/logs/save-trigger-worker.log # Watch general worker logs tail -f /var/www/html/viksa2/storage/logs/worker.log # Watch Laravel application logs tail -f /var/www/html/viksa2/storage/logs/laravel.log # Watch all worker logs simultaneously tail -f /var/www/html/viksa2/storage/logs/*-worker.log ``` ## Deployment Workflow When deploying changes that affect jobs: ```bash # 1. Pull latest code cd /var/www/html/viksa2 git pull # 2. Update dependencies (if needed) composer install --no-dev --optimize-autoloader # 3. Clear caches php artisan config:clear php artisan cache:clear php artisan queue:restart # 4. Restart supervisor workers sudo supervisorctl restart viksa2-worker:* sudo supervisorctl restart viksa2-register-creator:* sudo supervisorctl restart viksa2-save-trigger:* # 5. Verify workers are running sudo supervisorctl status | grep viksa2 ``` ## Troubleshooting ### Workers Not Processing Jobs ```bash # Check if workers are running sudo supervisorctl status | grep viksa2 # Check if jobs are queued in database mysql -e "SELECT * FROM viksa2_db.jobs ORDER BY id DESC LIMIT 10;" # Check worker logs for errors tail -100 /var/www/html/viksa2/storage/logs/register-creator-worker.log tail -100 /var/www/html/viksa2/storage/logs/save-trigger-worker.log ``` ### High Memory Usage If workers consume too much memory: ```bash # Add memory limit to worker command in supervisor config command=php -d memory_limit=2048M /var/www/html/viksa2/artisan queue:work # Or set max-time to restart workers periodically command=php /var/www/html/viksa2/artisan queue:work --max-time=3600 ``` ### Job Timeouts If jobs are timing out: 1. Increase `timeout` in job class 2. Increase `retry_after` in queue config 3. Increase `stopwaitsecs` in supervisor config ### Failed Jobs ```bash # View failed job details php artisan queue:failed # Retry failed jobs php artisan queue:retry all # Delete failed jobs older than 48 hours php artisan queue:prune-failed --hours=48 ``` ## Performance Tuning ### Adjust Worker Count Based on server resources: - **Low traffic**: 1 register-creator, 2 save-trigger - **Medium traffic**: 2 register-creator, 4 save-trigger (current) - **High traffic**: 4 register-creator, 8 save-trigger Edit `/etc/supervisor/conf.d/laravel-worker.conf` and change `numprocs` value. ### Sleep Time Optimization - `--sleep=1` for high-priority queues (save-trigger) - `--sleep=3` for normal queues (default, register-creator) - Lower values = more responsive, higher CPU usage ### Connection Pooling For database driver, ensure sufficient database connections: ``` Max Connections = (Workers × Processes) + Application Connections + Buffer ``` Example: (3 worker groups × 7 total processes) + 20 app connections + 10 buffer = 51 connections ## Best Practices 1. **Always use `queue:restart` after code changes** - Workers cache the application state 2. **Monitor failed jobs regularly** - Set up alerts for failed job threshold 3. **Use `--max-time` parameter** - Prevents memory leaks by restarting workers periodically 4. **Separate heavy and light jobs** - Use dedicated queues for different job types 5. **Log everything** - Use Laravel's logging extensively in job classes 6. **Test with `--once` flag** - Test job execution before deploying to production 7. **Set realistic timeouts** - Configure timeouts based on actual job execution times 8. **Use job tags** - Makes debugging easier with Telescope or Horizon ## Queue Priority If you need to process multiple queues with priority ordering: ```bash # Higher priority queues come first php artisan queue:work --queue=save-trigger,register-creator,default ``` This ensures `save-trigger` jobs are processed before `register-creator` jobs. ## Monitoring Tools ### Laravel Horizon (Optional) For advanced queue monitoring, consider installing Laravel Horizon: ```bash composer require laravel/horizon php artisan horizon:install php artisan migrate ``` Horizon provides a beautiful dashboard at `/horizon` with real-time queue metrics. ### Telescope (Optional) Laravel Telescope provides insights into job execution: ```bash composer require laravel/telescope --dev php artisan telescope:install php artisan migrate ``` Access the dashboard at `/telescope` to view job execution details. ## Related Files - **Job Classes**: `app/Jobs/RegisterCreatorJob.php`, `app/Jobs/ExecuteSaveTriggerJob.php` - **Queue Config**: `config/queue.php` - **Supervisor Config**: `/etc/supervisor/conf.d/laravel-worker.conf` - **Worker Logs**: `/var/www/html/viksa2/storage/logs/*-worker.log` - **Controllers**: - `app/Http/Controllers/RegisterCreatorController.php` (dispatches RegisterCreatorJob) - `app/Http/Controllers/AdminController.php` (dispatches ExecuteSaveTriggerJob) ## Support For issues or questions about queue management, refer to: - Laravel Queue Documentation: https://laravel.com/docs/queues - Supervisor Documentation: http://supervisord.org/ - Project Documentation: `resources/views/guide/` --- **Last Updated**: October 10, 2025 **Author**: DevQMS Team