Laravel&Lumen系统之队列服务

一般而言有些会阻塞运行程序的任务,我们会采用队列服务已经异步调用,这样可以实现非阻塞服务。之前有个需求是调用支付宝的服务,因为调用第三方的服务时间和成功不可控,所以处理成队列异步服务,发现功能竟然不可用,所以一步一步排查后解决这个问题。

1. 首先要确认的是队列的代码是否正确,Lumen和Laravel一样,都是需要继承虚拟基类Job,并且在handle方法中实现业务代码。

class DeleteBill extends Job
{
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        *****
    }
}

2. 确认调用处调用队列服务的地方是否正确。这里需要注意的是,Laravel文档里是用的dispatch分发调用:$this->dispatch(new DeleteBill()); 另外还有一种方法是使用Queue对象的push方法:Queue::push(new DeleteBill());这两种方式都是可以调用成功,它会把任务塞到相应的队列中。

3. 接下来是要检查系统的队列服务配置是否正确,可以查看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),
    ],

],

4. 查看服务器对应的配置和服务器redis启动参数是否正确,可以使用命令:ps aux | grep redis-server来查看服务是否启动以及对应的端口号。

5. 这些都正确,然后来看下Laravel&Lumen启动队列服务,使用php artisan queue:work来消费队列中的服务,至于队列错误重复次数设定还有超时时间等增强功能可以查看Laravel文档来仔细解读。

6. 最后我们使用Supervisor来监控队列,它将会在失败时自动重启queue:listen或queue:work命令,这样就可以达到随时分发的任务都可以被消费,这是比较方便的。以下是安装以及配置Supervisor的相关命令:

sudo apt-get install supervisor
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl -c /etc/supervisord.conf
sudo supervisorctl reload
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

这次排查整个队列服务,使得对于框架整个队列服务有了深刻的理解。以这边文章来记录整个过程。

PS:关于队列业务实现变更的时候,需要重启下php artisan queue:restart才可以生效。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注