聊聊 Laravel 的队列机制,了解一下队列的使用场景

2022-05-15 0 200

如何使用 Laravel 队列?下面由Laravel教程栏目给大家介绍一下使用 Laravel 队列的方法,以及使用队列的场景,希望对大家有所帮助!

聊聊 Laravel 的队列机制,了解一下队列的使用场景

为什么 ?

首先,我们要知道为什么要使用队列,不使用队列会怎么样!优缺点如何

我们可以举例 几个简单场景。

邮件发送

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

发送缓慢发送失败发送频率过高,被服务商拒绝 又或者 被进入垃圾箱

使用队列的好处在与哪里

提高客户端响应

当发送时,我们不要立即处理,而是丢给服务器,且队列进行管理和调度。 你可以自定义选择立即发送 或者 根据配置延迟发送

提高容错能力

在发送过程中,或许我们可能会遇到,目标被拒绝。例如大多数人 会遇到给 admin@qq.comn 发送报错 502 的场景。那这种场景,那么这种场景,我们可以理解其为是一个事件,在邮件发送的过程中,我们可以 引发构建出如下几种事件

发送失败邮件记录入库代码异常邮件发送成功回调发送失败重试

通过此邮件发送,可能会导致多个耗时任务的产生,那我们其实也可以构建出多个 队列服务 出来。每个队列管理 自己的事情,很好的 解耦 他们

通过 Laravel 队列 可以很好的进行设置 立即发送延迟发送重试发送

发送频率可控

使用过批量发送的邮件的 开发者 必然会遇到一个问题,那便是,如果我们直接进行批量发送,即同一时间 进行大量的邮件发送。那么邮件服务商很可能会把我们的邮件给拒绝 或者 邮件进入垃圾箱,被识别为 广告那么,这里便是用到了 延迟发送,我们可以根据当前队列服务中,已知的 正在等待 投递的邮件,合理的配置频率,或者 切换邮件配置,来达到,频率可控。

如设置 一个配置一分钟之类发送10次,等等方案。同样,我们这里可以做到 配置、频率控制、发送控制 解耦

其他

当然 我们还有很多种情况都会用到

服务器端下载 excel服务器端异步多任务处理 大数据错误消息处理

如何使用 Laravel 队列

这里只是列出,大概的使用方向,和如何更好的去使用。代码可能跑不起起来,主要是理解 逻辑我们这里 使用的是 Redis 作为驱动

驱动设置为 Redis

> .envQUEUE_CONNECTION=redis> 在 config/queue.php 中可以找到

快速创建队列 和 投递任务

# 创建 任务php artisan make:job ProcessPodcast

自动生成 app/Jobs/EmailJob.php

class EmailJob implements ShouldQueue{    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;    protected $data;    /**     * 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 也是通过 队列实现的

# 创建 Eventphp artisan make:event FailEventclass 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 FailListenerclass 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.phpprotected $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 的用法还有很多,满足自己的需求即可。

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

更多编程相关知识,请访问:编程入门!!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 聊聊 Laravel 的队列机制,了解一下队列的使用场景 https://www.jike1995.com/36901.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务