消息队列使用场景
最近开了一款基于think-queue的消息队列插件,集成了异步发短信与邮件的功能,很多小伙伴可能不太理解为什么要使用消息队列,在此我简单说明一下。
消息队列的核心作用就是异步处理任务,所谓异步,就是不会立即返回结果。只是将任务抛给队列去处理。就像餐馆里,来客人了,开始下单,服务员将订单丢给后厨,自己则不用管菜是怎么做的,多久可以做完。
使用消息队列也是一样的道理,当用户发起http请求时,假设这个请求是要群发1万封邮件,你要让用户慢慢等吗?自然不是,把任务丢给消息队列,然后直接告诉用户“请求成功”,实际上群发邮件的任务在队列中慢慢执行,这样用户体验就大大提升。
我再举一个栗子:我们使用电商经常见到“订单30分钟未支付将自动关闭”的功能,这个功能可以使用消息队列的“延迟队列”功能来实现。所谓延时队列就是任务不立马执行,而是延迟一段时间执行。在下单时将任务丢进队列,设置延迟30分钟,那么30分钟后该任务被执行,判断该订单是否支付,未支付自动关闭订单。
消息队列在实际项目中的使用场景非常多,它的核心思想就是“异步”,更多的使用场景待大家自己去发掘。
而fastadmin消息队列这个插件默认集成了短信与邮件功能,大家可以在此基础之上实现自己的功能。下面将详细介绍使用方法。
安装
消息队列插件的安装与最基本的使用已经在插件首页详细说明了,这里不再说了,大家自己看吧:https://www.fastadmin.net/store/faqueue.html
使用
开发自己的功能
如果我想利用消息队列开发一个订单30分钟后自动关闭的功能,要怎么做呢?
首先你得按照插件首页的说明将队列安装好,确保能正常运行。
步骤一:定义个类 OrderJob.php,放在addons/faqueue/library/jobs下(其他目录也可以)
<?phpnamespace addonsfaqueuelibraryjobs;use thinkqueueJob;class OrderJob{ /** * @param Job $job 任务对象 * @param $data 数据 * 消息队列将自动调用该方法 */ public function fire(Job $job, $data){ //从data中拿数据 $orderId = $data['order_id']; //判断订单是否未支付,未支付则关闭 //..... //如果任务执行失败,使用release()将任务再次丢会队列,再次执行,避免任务丢失 if(false){ $job->release(); } //attempts() 可以获取当前任务已经尝试执行几次 if($job->attempts() > 3){ //假设同一个任务尝试执行了多次都失败,那么我们可能需要打印日志,甚至通知开发者人工介入 } //任务执行完成,记得删除任务 $job->delete(); } //启动队列时可以指定一个任务可以尝试执行n次,如果都不成功,将自动调用该方法 public function failed($data){ }}
步骤二:启动队列
启动队列有两种方式:
# 建议开发测试时使用php think queue:listen# 建议生产环境使用php think queue:work --daemon(不加--daemon为执行单个任务)
步骤三:将任务丢给队列
$job = "addonsfaqueuelibraryjobsOrderJob";$data["order_id"] = 123456;$queue = null; //指定哪一个队列,可不填//later方法是延迟执行,延迟时间以秒为单位thinkQueue::later(30*60,$job, $data, $queue);//push则是立马执行//thinkQueue::push($job, $data, $queue);
搞定!
多个队列
启动队列时,其实我们是默认启动了一个叫“default”的队列,队列中的任务是依次执行的,比如有1000个任务,那么这1000个任务会一个个执行,效率相对较低。
那么我们可以给任务分类,启动多个队列,假如发邮件队列,订单队列等。
php think queue:listen --queue emailphp think queue:listen --queue order
将任务发给队列时,使用第三个参数指定发送到指定队列:
thinkQueue::push($job, $data, "email");thinkQueue::push($job, $data, "order");
其他参数
队列启动时还可以指定其他参数,大家可以用php think queue:listen --help
查看说明:
zhoujundeiMac:fablog zhoujun$ php think queue:listen --helpUsage: queue:listen [options]Options: --queue[=QUEUE] The queue to listen on --delay[=DELAY] Amount of time to delay failed jobs [default: 0] --memory[=MEMORY] The memory limit in megabytes [default: 128] --timeout[=TIMEOUT] Seconds a job may run before timing out [default: 60] --sleep[=SLEEP] Seconds to wait before checking queue for jobs [default: 3] --tries[=TRIES] Number of times to attempt a job before logging it failed [default: 0] -h, --help Display this help message -V, --version Display this console version -q, --quiet Do not output any message --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
其中比较常用的就是--queue
和--tries
--tries
是指定任务尝试执行次数,如:php think queue:listen --tries 3
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。