Files
citrus-cms/resources/views/guide/QUEUE_MANAGEMENT_GUIDE.md
T
2026-04-28 21:15:09 +03:00

360 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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