laravel队列使用场景(laravel的队列)

技术Laravel的队列机制怎么用这篇文章主要介绍了Laravel的队列机制怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。为什么 ?首先,我们要知道

本文主要介绍了Laravel的队列机制是如何使用的,具有一定的参考价值。有兴趣的朋友可以参考一下。希望大家看完这篇文章后收获多多。让边肖带你去了解它。

00-1010首先,我们需要知道为什么使用队列,如果不使用队列会发生什么!优缺点?

我们可以举一些简单的例子。

邮件发送

邮件发送一般会面临哪些问题

慢慢发送

发送失败。

发送频率过高,被服务商拒收或扔进垃圾箱。

使用队列的好处在与哪里

改善客户反应

发送时,我们不想马上处理,而是扔给服务器,队列被管理和调度。您可以根据配置自定义立即发送或延迟发送的选项。

提高容错能力。

在发送过程中,我们可能会遇到目标被拒绝的情况。例如,大多数人会遇到向admin@qq.comn发送错误502的场景。

这种场景,那么这种场景,我们可以理解为是一个事件。在发送邮件的过程中,我们可以触发以下事件。

发送这封电子邮件可能会导致多项耗时的任务,因此我们实际上可以建立多个队列服务.每个队列都管理自己的事务,解耦他们很好。

拉弗尔队列可以用来很好地设定立即发送,延迟发送重试发送

发送失败。

邮件记录入库

代码异常

邮件已成功发送回拨

发送失败重试

传输频率可控

使用过批量邮件的开发人员难免会遇到一个问题,那就是如果我们直接批量发送,也就是同时发送大量邮件。那么邮件服务提供商很可能会拒绝或邮件进入垃圾箱我们的邮件,并将其识别为广告.然后,这里是延迟发送.我们可以根据当前队列服务中等待投递的已知邮件合理配置频率或切换邮件配置,从而可以控制频率。

例如,将配置设置为每分钟发送10次,以此类推。

同样,我们可以在这里做配置、频率控制、发送控制 解耦

其他

当然,还有很多其他情况我们可以利用。

服务器下载excel

服务器端异步多任务处理大数据

错误消息处理

如何使用 Laravel 队列

这里只是列出了大致的使用方向以及如何更好的使用。代码可能不会运行,主要是为了理解逻辑。

我们这里使用Redis作为驱动程序。

驱动设置为 Redis。包封/包围(动词envelop的简写)

QUEUE_CONNECTION=redis

快速创建队列 和 投递任务可以在config/queue.php中找到

#创建任务

phisanmake : jobprocesspodcast自动生成app/jobs/emailjob.php。

classEmailJobimplementsShouldQueue

{

useDispatchable,InteractsWithQueue,Queueable,SerializesModels

受保护的$数据;

/**

不间断空格

;   * Create a new job instance.
     *
     * @return void
     */
    public function __construct(array $data)
    {
        $this->data = $data;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $service = new EmailService();

        // ... 检查当前可用 Mailer
        // 这里你自定义就好了,这个方法中你可以根据你自己的配置,获取到当前可用的配置
        $mailer = $service->getMailer();

        // ... 获取当前要发送的数据
        $data = $this->data;
        
        $service->send($mailer, $data);
    }
}

一些常用操作

这些操作都能从 文档中找到

调用 发送

# 延迟 2分钟 发送
# 这里使用的是 Crontab 包 (不过 Laravel 自带)
EmailJob::dispatch()->delay(now()->addMinutes(2));

# 立即发送 (不会进入到队列中)
EmailJob::dispatchNow();

这里的队列默认用的 是 defult 队列,我们可以修改为指定队列服务

public function __construct(array $data)
{
    # 使用 emailQueue
    $this->onQueue('emailQueue');
    $this->data = $data;
}

设置失败情况下重试次数

# 重试 5 次
public $tries = 5;

设置超时时间

/**
* 确定任务应该超时的时间
*
* @return \DateTime
*/
public function retryUntil()
{
    return now()->addMinutes(10);
}

启动我们的队列

如果不配置 onQueue 的话,可以不带 ---queue 参数配置

php artisan queue:work --queue=emailQueue

结合 Events 来解耦

Laravel Event 也是通过 队列实现的

# 创建 Event
php artisan make:event FailEvent

class FailEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    protected $data;
    protected $tag;

    /**
     * @param array $data 投递的数据
     * @param string $tag 要操作的事情
     */
    public function __construct(array $data, string $tag = 'system')
    {
        $this->data = $data;
        $this->tag = $tag;
    }
}

# 创建 listener 
php artisan make:listener FailListener
class FailListener
{
    /**
    * Handle the event.
    * 
    * @param  object  $event
    * @return void
    */
    public function handle(FailEvent $event)
    {
        $this->{$event->tag}($event->data);
    }

    /**
     * 处理系统异常
     * DateTime: 2021/12/3 11:02 上午
     * @param array $data
     */
    public function system(array $data)
    {

    }

    /**
    * 处理邮件异常
    * DateTime: 2021/12/3 11:02 上午
    */
    public function email()
    {
    
    }

}

# app/Providers/EventServiceProvider.php
protected $listen = [
    FailEvent::class => [
        FailListener::class,
    ],
]

# 投递
event(new FailEvent(['error' = '异常信息'], 'email'));

其他

其实,Laravel 大多数帮我实现了整个流程而已。可以尝试自己使用 redis 来实现一个可控队列。熟练是掌握 Redis 相关数据类型即可.
这里简要列出 Redis 中,在以上模式中会用到的数据类型

  • List

    使用 它可以完成 出栈 入栈的 队列功能

  • Hash

    使用他 可以用来存储,序列化后的 Event 或者 Job  __construct 传入进去的数据,尽量不要将整个 类 序列化进去

    也可以实现存储,Mailer 数据

  • Sorted Set

    可以 设置时间为 Sorted Set 中的分数,通过分数排序,找到我们最近要执行的队列任务

当然,Redis 的用法还有很多,满足自己的需求即可。

世界上没有完美的解决方案,只有最适合你自己的方案,在工作中遇到问题,尽量要学会举一反三,合理的运用各种 工具,设计方案去实现。
代码 只是最终一个缩影而已,最终的要学会理解,每个语言 每个框架,也只是一种方案的实现,融会贯通才无敌 ...

感谢你能够认真阅读完这篇文章,希望小编分享的“Laravel的队列机制怎么用”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153650.html

(0)

相关推荐

  • Java高并发下怎么保证接口的幂等性

    技术Java高并发下怎么保证接口的幂等性本篇内容介绍了“Java高并发下怎么保证接口的幂等性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅

    攻略 2021年10月30日
  • 最小的质数和最小的合数是什么,什么是合数?最小的合数是多少

    技术最小的质数和最小的合数是什么,什么是合数?最小的合数是多少合数指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。与之相对的是质数,而1既不属于质数也不属于合数。最小的合数是4。合数的性质最小的质数和最

    生活 2021年10月19日
  • jvm有哪些垃圾回收机制(jvm垃圾回收实现原理和优点)

    技术JVM垃圾回收基本原理是什么这篇文章主要介绍“JVM垃圾回收基本原理是什么”,在日常操作中,相信很多人在JVM垃圾回收基本原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM

    2021年12月21日
  • vue3组件通信(vue3子组件之间如何通信)

    技术vue3组件通信的几种方式分别是这样的vue3组件通信的几种方式分别是这样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。vue3组件通信方式为以下几种

    攻略 2021年12月14日
  • Sequoiadb中怎么进行分组去重(sql分组去重)

    技术Sequoiadb中怎么进行分组去重这篇文章主要讲解了“Sequoiadb中怎么进行分组去重”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Sequoiadb中怎么进行

    攻略 2021年12月22日
  • Go语言中什么是互斥锁

    技术Go语言中什么是互斥锁这篇文章将为大家详细讲解有关Go语言中什么是互斥锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、互斥锁Mutex1.1 Mutex介绍Go

    攻略 2021年10月21日