环境:lz用的是Homestead5.4.0 Laravel5.5
(一)队列的配置文件路径:config/queue.php,Laravel为我们提供了多种驱动的配置:sync, database,beanstalkd,sqs,redis。
sync是默认的驱动,选择该驱动任务会立即执行(同步),供本地使用。
附上官方文档的解释:a synchronous driver that will execute jobs immediately (for local use)
(二)本文主要说Redis驱动,请确保QUEUE_DRIVER的值是redis
要使用Redis驱动确保环境中已安装redis,以及redis依赖扩展,lz用的是predis
lz要实现的功能生成artisan命令,命令中分发任务
(1)生成任务
执行命令php artisan make:job TestJob,生成的文件默认放在app/jobs目录,由于主要想先把队列跑通,所以这里不写具体的业务逻辑,只在任务的handle()方法里打印个log,另一个job在此不提。
(2)分发任务 :artisan命令的代码
这里lz想说下指定队列和指定连接:
指定队列连接:前面说过laravel为我们提供了多种队列的驱动配置,只要安装了相应的驱动,使用onConnection('')即可指定使用的驱动;
指定队列:如果想指定队列,使用onQueue即可,名字随便取;
(3)运行队列处理器
运行队列处理器的命令为php artisan queue:work 。该命令执行后将一直在后台运行,直至手动或者有错误导致退出。
示例:
php artisan queue:work redis --queue=test,sms
该命令参数redis指定了队列的连接,你可以在这里队列配置文件中的任何一种连接(一定要配好驱动),
该命令的--queue选项 有两个作用 :指定了队列为test,sms;同时也指定了队列先后顺序,打印log就能发现test队列在线sms在后
运行此命令后会看到队列处理器工作的日志(后期补图,忽略内容详细信息),如果没有看到日志请去检查QUEUE_DRIVER是否配置为了redis
(4)Horizon
由于Horizon是Laravel官方扩展,看起来很高大上的样子,不知道性能如何。
安装过程:
-----安装依赖composer require laravel/horizon;
-----发布依赖php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider",此时会在config目录下生成horizon.php文件;
----负载均衡配置-可暂时按照默认设置;
----权限配置修改AppServiceProvider文件;
Horizon::auth(function ($request) {
//这里可以写权限相应的逻辑,符合什么条件才可以访问监控面板
//最后应该返回true以确保我们可以在浏览器中访问到面板
return true / false;
});
----运行php artisan horizon启动面板,访问 你的域名/horizon可以看到监控面板已处于激活状态,但是此时我们发现面板Metrics和Recent Jobs菜单里什么数据都没有展示,我们需要再执行下面的操作;
----在app/Console/Kernel.php文件中添加命令$schedule->command('horizon:snapshot')->everyFiveMinutes();以获取数据填充面板。
(5)要保证队列处理器的正常运行我们需要安装进程守护程序Supervisor
简单介绍下Supervisor,Linux/Unix经常用它来维护进程,不支持Windows,当进程意外终止时Supervisor会自动将进程重启,该工具由Python编写,所以需要Python的运行环境。
安装过程:
----安装supervisor,执行命令yum install supervisor
----执行cat /etc/supervisord.会发现etc多了一个文件和一个目录;
/etc/supervisord.conf为主配置文件,一般不建议把其它进程写进主配置文件;
/etc/supervisord.d目录即为放置其他进程配置文件的目录;
----查看/etc/supervisor.conf文件最后一行,意思是配置文件加载时会加载supervisord.d目录下后缀名是ini的文件,我们为监控面板和队列执行器的配置守护进程时的配置文件写到这个目录
----为后台的horizon配置守护进程,新建 /etc/supervisord.d/horizon.ini进程文件,内容为
[program:horizon-bg]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/share/nginx/html/operation/artisan horizon
autostart=true
autorestart=true
user=nginx
redirect_stderr=true
stdout_logfile=/root/queue/operation-horizon.log //日志路径,确保路径存在
----为后台的队列处理器配置守护进程,新建/etc/supervisord.d/worker.ini进程文件,内容为
[program:worker-bg]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/share/nginx/html/operation/artisan queue:work redis --queue=test_a,test_b --sleep=3 --tries=3
autostart=true //自动开启
autorestart=true //自动重启
user=root //启动进程的用户
numprocs=8 //进程数量
stdout_logfile=/root/queue/operation-worker-bg.log //日志路径,确保路径存在
----启动supervisor
supervisord -c /etc/supervisord.conf
supervisorctl -c /etc/supervisord.conf
执行后可以看到horizon有一个进程worker有个8个,队列执行器的进程数可以在配置文件中配置
================================================================================================================================================================================================
目前针对 多台服务器都要部署监控队列服务 想到的解决方案:
在两台服务器都需要配置horizon和supervisor服务;
supervisor守护进程需要为队列执行器和horizon编写配置文件;
但是抓取数据的计划任务只需要部署到一台服务器即可。
欢迎指正