一般而言有些会阻塞运行程序的任务,我们会采用队列服务已经异步调用,这样可以实现非阻塞服务。之前有个需求是调用支付宝的服务,因为调用第三方的服务时间和成功不可控,所以处理成队列异步服务,发现功能竟然不可用,所以一步一步排查后解决这个问题。
- 首先要确认的是队列的代码是否正确,Lumen和Laravel一样,都是需要继承虚拟基类Job,并且在handle方法中实现业务代码。
class DeleteBill extends Job
{
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
*****
}
}
- 确认调用处调用队列服务的地方是否正确。这里需要注意的是,Laravel文档里是用的dispatch分发调用:$this->dispatch(new DeleteBill()); 另外还有一种方法是使用Queue对象的push方法:Queue::push(new DeleteBill());这两种方式都是可以调用成功,它会把任务塞到相应的队列中。
- 接下来是要检查系统的队列服务配置是否正确,可以查看config文件夹下的queue.php的配置。队列一般支持"sync", "database", "beanstalkd","sqs", "iron", "redis"这几种,我们可以自定义自己的具体配置方式:
'default' => env('QUEUE_DRIVER', 'sync')
类似于这样配置,在env文件中想要配置哪种都可以。本人使用的是redis服务,然后在database.php查看redis配置:
'redis' => [
'cluster' => env('REDIS_CLUSTER', false),
'default' => [
'host' => env('REDIS_HOST', '121.41.13.126'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE', 0),
'password' => env('REDIS_PASSWORD', null),
],
]
- 查看服务器对应的配置和服务器redis启动参数是否正确,可以使用命令:ps aux | grep redis-server来查看服务是否启动以及对应的端口号。
- 这些都正确,然后来看下Laravel&Lumen启动队列服务,使用php artisan queue:work来消费队列中的服务,至于队列错误重复次数设定还有超时时间等增强功能可以查看Laravel文档来仔细解读。
- 最后我们使用Supervisor来监控队列,它将会在失败时自动重启queue:listen或queue:work命令,这样就可以达到随时分发的任务都可以被消费,这是比较方便的。以下是安装以及配置Supervisor的相关命令:
sudo apt-get install supervisor
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02dcommand=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemonautostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
sudo supervisord -c /etc/supervisord.confsudo
supervisorctl -c /etc/supervisor/supervisord.conf
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
这次排查整个队列服务,使得对于框架整个队列服务有了深刻的理解。以这边文章来记录整个过程。
大家喜欢可以访问我的个人网站:http://www.yingminxing.com
如有疑问,欢迎沟通交流:QQ:370399195, 微信:yingminxing1988