美文网首页
Laravel&Lumen系统之队列服务

Laravel&Lumen系统之队列服务

作者: 瑛民星 | 来源:发表于2017-04-08 14:42 被阅读626次

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

    1. 首先要确认的是队列的代码是否正确,Lumen和Laravel一样,都是需要继承虚拟基类Job,并且在handle方法中实现业务代码。
    class DeleteBill extends Job
    {
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            *****
        }
    }
    
    1. 确认调用处调用队列服务的地方是否正确。这里需要注意的是,Laravel文档里是用的dispatch分发调用:$this->dispatch(new DeleteBill()); 另外还有一种方法是使用Queue对象的push方法:Queue::push(new DeleteBill());这两种方式都是可以调用成功,它会把任务塞到相应的队列中。
    2. 接下来是要检查系统的队列服务配置是否正确,可以查看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),
        ],
    ]
    
    1. 查看服务器对应的配置和服务器redis启动参数是否正确,可以使用命令:ps aux | grep redis-server来查看服务是否启动以及对应的端口号。
    2. 这些都正确,然后来看下Laravel&Lumen启动队列服务,使用php artisan queue:work来消费队列中的服务,至于队列错误重复次数设定还有超时时间等增强功能可以查看Laravel文档来仔细解读。
    3. 最后我们使用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

    相关文章

      网友评论

          本文标题:Laravel&Lumen系统之队列服务

          本文链接:https://www.haomeiwen.com/subject/klvlattx.html