消息队列插件使用教程与经验分享

地址: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

猜你喜欢

转载自blog.csdn.net/a898712940/article/details/84560967
今日推荐