Laravel&Lumen系统之队列服务

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

  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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • 队列 简介 laravel 的队列服务对各种不同的后台队列服务提供了统一的 API。队列允许你延迟执行消耗时间的任...
    Dearmadman阅读 20,803评论 7 26
  • Composer Repositories Composer源 Firegento - Magento模块Comp...
    零一间阅读 3,970评论 1 66
  • 队列常常用于两种场景,一种是高并发的情况,一种是耗时的操作,可以将任务放到队列中去,消费者从队列取任务执行,当然还...
    金星show阅读 1,771评论 2 0
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,629评论 0 121