博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel 队列系统
阅读量:7047 次
发布时间:2019-06-28

本文共 2743 字,大约阅读时间需要 9 分钟。

hot3.png

使用场景

  • 异步 - 耗时任务延迟处理,缩短请求响应时间,提高反馈效率,避免程序超时
  • 重试 - 确保任务的可靠执行

配置

队列驱动支持

config/queue.php每个队列驱动都基于底层连接,且通过属性queue指定默认队

  • 原生支持Redis、Beanstalkd、Database(需:php artisan queue:table && php artisan migrate)、Sqs、IronMQ
  • 原生测试支持sysnc同步驱动(立即执行Job)null驱动(简单丢弃Job)
  • 开源第三方驱动支持RabbitMQ、Kafka

Fail表准备

php artisan queue:failed-tablephp artisan migrate

Job创建

  • php artisan make:job MyJob(默认实现接口ShouldQueue以队列化的异步执行)
  • 构造函数传参model实例,则仅有ID会被序列化并存入队列,消费时通过ID于数据库重新取回
  • $myJob = new MyJob(); dispatch($myJob);
    • handle方法:Job消费逻辑
    • failed(Exception $exception)方法:Job失败后的收尾逻辑
  • 同类型Job建议投递到同一队列上(比如短信Job邮件Job都投递到notification队列上)

Job定制

  • 指定延迟:$myJob->delay(Carbon::now()->addMinutes(10))
  • 指定队列:$myJob->onQueue(指定队)
  • 指定连接:$myJob->onConnection(指定连接)
  • 指定Job重试次数:public $tries = 3;(Job执行中发生Excepion则被退回队列并重试)
  • 指定Job运行超时:public $timeout = 60;(秒)

##Queue执行

  • 保持运行直至手动停止
  • 长时间运行进程,并使用启动时的代码上下文
  • --queue参数先后顺序可指定优先级
  • 留意在完成Job后释放相关资源
# 启动队列执行器* 生产环境(高效模式):php artisan queue:work --daemon [--quiet ] [--delay=3] [--sleep=队列空后的休眠时间] [--tries=3] [--timeout=30] [--memory=默认128M] [--queue=队列1,队列2] [指定连接]* 测试环境(每次重载上下文):php artisan queue:listen [--tries=3] [--timeout=30] [--sleep=队列空后的休眠时间] [--queue=队列1,队列2] [指定连接]# 重启队列执行器(以便在项目部署时重载代码上下文)php artisan queue:restart

Queue 超时&过期

  • 过期(队列连接的retry_after属性)指定了Job重试的等待时间
  • 超时(--timeout)指定了处理Job的子队列执行器被kill前的超时时间
  • 超时应该确保比过期时间短几秒,这样Job会先超时被kill,然后在到达过期时间后被重试

Job失败

失败流程

  • 每当Job失败,执行failed(Exception $exception)方法中失败后的收尾逻辑
  • 如果Job在最终尝试后还失败,则入表failed_jobs

FailedJob处理

  • 罗列 php artisan queue:failed
  • 重试 php artisan queue:retry all|jobID
  • 删除 php artisan queue:forget all|jobID
  • 清空 php artisan queue:flush

Job监听

# AppServiceProvider::boot 中注册Job事件的监听//$event->connectionName//$event->job->payload()//$event->exceptionQueue::before(function(JobProcessing $event){});Queue::after(function(JobProcessed $event){});Queue::failing(function(JobFailed $event){});# queue worker请求Job前Queue::looping(function(){	# 可处理一些回滚    while (DB::transactionLevel() > 0) {        DB::rollBack();    }});

队列消费服务

通过supervisor启动队列消费服务

  • 进程守护队列消费服务
  • 多进程方式消费队列中的Job

配置

# /etc/supervisor/conf.d/queue-worker-test.conf    [program:queue-worker-test]    process_name=%(program_name)s_%(process_num)02d    directory=/var/www/html    command=php artisan queue:work --daemon --quiet --delay=3 --sleep=3 --tries=3 --memory=1024 --queue=test    autostart=true    autorestart=true    user=www    numprocs=5 #当>1时, process_name必须有%(process_num)    priority=997    stopsignal=QUIT    redirect_stderr=true    stdout_logfile=/dev/null    stdout_logfile_maxbytes=0    stdout_logfile_backups=0    stderr_logfile=/dev/null    stderr_logfile_maxbytes=0    stderr_logfile_backups=0

启动

sudo supervisorctl reread	sudo supervisorctl update	sudo supervisorctl start queue-worker-test:*

转载于:https://my.oschina.net/u/2400083/blog/911206

你可能感兴趣的文章
重装系统后删除Cygwin文件夹
查看>>
享元模式
查看>>
M4修改外部晶振8M和25M晶振的方法
查看>>
六、python小功能记录——递归删除bin和obj内文件
查看>>
EF架构~数据分批批量提交
查看>>
angular 数据内容有重复时不显示问题
查看>>
二叉树的路径和
查看>>
asp.net中JQuery AJAX的解决方案
查看>>
像素与rem转换
查看>>
urlencode遇到中文编码问题
查看>>
在一周之内,快速看完整部教材,列出你不懂的5-10个问题,发布在个人博客上。...
查看>>
Javascript:作用域 学习总结
查看>>
leetcode654
查看>>
利用WinRar命令行定时备份Sql2005数据库!
查看>>
010——VUE中使用lodash库减少watch对后台请求的压力
查看>>
Yii框架上传后展示图片
查看>>
EXCEL教程,包你一学就会
查看>>
二叉堆 - 最小堆
查看>>
Linux 定时任务
查看>>
appium脚本报错selenium.common.exceptions.WebDriverException
查看>>