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)

相关推荐

  • 理解 JavaScript 闭包

    技术理解 JavaScript 闭包 理解 JavaScript 闭包闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是 ECMAScript 规范给的

    礼包 2021年12月14日
  • 查看docker容器停止原因(docker容器网络异常怎么办)

    技术docker容器时区错误问题该怎么解决docker容器时区错误问题该怎么解决,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。背景利用node-schedu

    攻略 2021年12月13日
  • Redis与数据库数据一致性的示例分析

    技术Redis与数据库数据一致性的示例分析这期内容当中小编将会给大家带来有关Redis与数据库数据一致性的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 可能谈到保持R

    攻略 2021年12月1日
  • 数据分析

    技术数据分析 数据分析数据预处理
    在本次数据分析过程中,缺失数据将被进一步划分成为三个部分,一类数据是数据为0的情况,一类是数据为空值的情况,一类是数据为特殊符号,例如“--”的数据。
    针对不同的数据缺

    礼包 2021年11月18日
  • SQLServer2012镜像主库挂掉怎么切换到镜像备库

    技术SQLServer2012镜像主库挂掉怎么切换到镜像备库本篇内容介绍了“SQLServer2012镜像主库挂掉怎么切换到镜像备库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学

    攻略 2021年11月8日
  • 怎样使用Mfuzz进行时间序列表达模式聚类分析

    技术怎样使用Mfuzz进行时间序列表达模式聚类分析怎样使用Mfuzz进行时间序列表达模式聚类分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获

    攻略 2021年11月10日