地址:https://forum.fastadmin.net/thread/6817
消息队列使用场景
最近开了一款基于think-queue的消息队列插件,集成了异步发短信与邮件的功能,很多小伙伴可能不太理解为什么要使用消息队列,在此我简单说明一下。
消息队列的核心作用就是异步处理任务,所谓异步,就是不会立即返回结果。只是将任务抛给队列去处理。就像餐馆里,来客人了,开始下单,服务员将订单丢给后厨,自己则不用管菜是怎么做的,多久可以做完。
使用消息队列也是一样的道理,当用户发起http请求时,假设这个请求是要群发1万封邮件,你要让用户慢慢等吗?自然不是,把任务丢给消息队列,然后直接告诉用户“请求成功”,实际上群发邮件的任务在队列中慢慢执行,这样用户体验就大大提升。
我再举一个栗子:我们使用电商经常见到“订单30分钟未支付将自动关闭”的功能,这个功能可以使用消息队列的“延迟队列”功能来实现。所谓延时队列就是任务不立马执行,而是延迟一段时间执行。在下单时将任务丢进队列,设置延迟30分钟,那么30分钟后该任务被执行,判断该订单是否支付,未支付自动关闭订单。
消息队列在实际项目中的使用场景非常多,它的核心思想就是“异步”,更多的使用场景待大家自己去发掘。
而fastadmin消息队列这个插件默认集成了短信与邮件功能,大家可以在此基础之上实现自己的功能。下面将详细介绍使用方法。
安装
消息队列插件的安装与最基本的使用已经在插件首页详细说明了,这里不再说了,大家自己看吧:https://www.fastadmin.net/store/faqueue.html
使用
开发自己的功能
如果我想利用消息队列开发一个订单30分钟后自动关闭的功能,要怎么做呢?
首先你得按照插件首页的说明将队列安装好,确保能正常运行。
步骤一:定义个类 OrderJob.php,放在addons/faqueue/library/jobs下(其他目录也可以)
<?php
namespace addons\faqueue\library\jobs;
use think\queue\Job;
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 = "addons\faqueue\library\jobs\OrderJob";
$data["order_id"] = 123456;
$queue = null; //指定哪一个队列,可不填
//later方法是延迟执行,延迟时间以秒为单位
think\Queue::later(30*60,$job, $data, $queue);
//push则是立马执行
//think\Queue::push($job, $data, $queue);
搞定!
多个队列
启动队列时,其实我们是默认启动了一个叫“default”的队列,队列中的任务是依次执行的,比如有1000个任务,那么这1000个任务会一个个执行,效率相对较低。
那么我们可以给任务分类,启动多个队列,假如发邮件队列,订单队列等。
php think queue:listen --queue email
php think queue:listen --queue order
将任务发给队列时,使用第三个参数指定发送到指定队列:
think\Queue::push($job, $data, "email");
think\Queue::push($job, $data, "order");
其他参数
队列启动时还可以指定其他参数,大家可以用php think queue:listen --help
查看说明:
zhoujundeiMac:fablog zhoujun$ php think queue:listen --help
Usage:
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