业务场景
使用larave框架
开发,有多个队列任务,其中有个别任务特别耗时,使用单个队列的话必须等待前一个任务完成下一个任务才会开始,这个时候就需要给耗时的任务单独分配队列,任务之间互不影响,可以同时单独执行。
生产者设置
生产者负责生产消息,多队列需要在生产消息时指定该任务需要分配的队列名称。
假设有两个队列任务,任务1分配到队列1,任务2分配到队列2,代码示例:
dispatch($data1)->onQueue('queue1');
dispatch($data2)->onQueue('queue2');
消费队列设置
这里为每个队列单独设置一条队列命令
//打开第一个终端
php artisan queue:work --queue=queue1
//打开第二个终端
php artisan queue:work --queue=queue2
可以在系统的crontab
或者使用supervisor
进行任务执行和监控
supervisor
配置可以参考
[program:queue1]
process_name=queue1
command=php /var/www/html/artisan queue:work --queue=queue1 --timeout=10000
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/queue1.log
[program:queue2]
process_name=queue2
command=php /var/www/html/artisan queue:work --queue=queue2 --timeout=10000
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/queue2.log
需要注意的是两个任务虽然可以合并成一条执行命令,像
php artisan queue:work --queue=queue1,queue2
这样可以同时启动两个队列,但是两个队列还是会排队执行,不会并行执行,如果任务不耗时,任务量不多,可以使用这种方式