Laravel的隊(duì)列機(jī)制怎么用

這篇文章主要介紹了Laravel的隊(duì)列機(jī)制怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)整合營(yíng)銷推廣、網(wǎng)站重做改版、米東網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為米東等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

為什么 ?

首先,我們要知道為什么要使用隊(duì)列,不使用隊(duì)列會(huì)怎么樣!優(yōu)缺點(diǎn)如何

我們可以舉例 幾個(gè)簡(jiǎn)單場(chǎng)景。

郵件發(fā)送

郵件發(fā)送一般會(huì)面臨哪些問題??

  • 發(fā)送緩慢

  • 發(fā)送失敗

  • 發(fā)送頻率過高,被服務(wù)商拒絕 又或者 被進(jìn)入垃圾箱

使用隊(duì)列的好處在與哪里

  • 提高客戶端響應(yīng)

    當(dāng)發(fā)送時(shí),我們不要立即處理,而是丟給服務(wù)器,且隊(duì)列進(jìn)行管理和調(diào)度。 你可以自定義選擇立即發(fā)送 或者 根據(jù)配置延遲發(fā)送

  • 提高容錯(cuò)能力

    在發(fā)送過程中,或許我們可能會(huì)遇到,目標(biāo)被拒絕。例如大多數(shù)人 會(huì)遇到給 admin@qq.comn 發(fā)送報(bào)錯(cuò) 502 的場(chǎng)景。 那這種場(chǎng)景,那么這種場(chǎng)景,我們可以理解其為是一個(gè)事件,在郵件發(fā)送的過程中,我們可以 引發(fā)構(gòu)建出如下幾種事件

    通過此郵件發(fā)送,可能會(huì)導(dǎo)致多個(gè)耗時(shí)任務(wù)的產(chǎn)生,那我們其實(shí)也可以構(gòu)建出多個(gè) 隊(duì)列服務(wù)出來。每個(gè)隊(duì)列管理 自己的事情,很好的 解耦他們

    通過 Laravel 隊(duì)列 可以很好的進(jìn)行設(shè)置 立即發(fā)送、延遲發(fā)送、重試發(fā)送

    • 發(fā)送失敗

    • 郵件記錄入庫(kù)

    • 代碼異常

    • 郵件發(fā)送成功回調(diào)

    • 發(fā)送失敗重試

  • 發(fā)送頻率可控

    使用過批量發(fā)送的郵件的 開發(fā)者 必然會(huì)遇到一個(gè)問題,那便是,如果我們直接進(jìn)行批量發(fā)送,即同一時(shí)間 進(jìn)行大量的郵件發(fā)送。那么郵件服務(wù)商很可能會(huì)把我們的郵件給拒絕 或者 郵件進(jìn)入垃圾箱,被識(shí)別為 廣告那么,這里便是用到了 延遲發(fā)送,我們可以根據(jù)當(dāng)前隊(duì)列服務(wù)中,已知的 正在等待 投遞的郵件,合理的配置頻率,或者 切換郵件配置,來達(dá)到,頻率可控。

    如設(shè)置 一個(gè)配置一分鐘之類發(fā)送10次,等等方案。 同樣,我們這里可以做到 配置、頻率控制、發(fā)送控制 解耦

其他

當(dāng)然 我們還有很多種情況都會(huì)用到

  • 服務(wù)器端下載 excel

  • 服務(wù)器端異步多任務(wù)處理 大數(shù)據(jù)

  • 錯(cuò)誤消息處理

如何使用 Laravel 隊(duì)列

這里只是列出,大概的使用方向,和如何更好的去使用。代碼可能跑不起起來,主要是理解 邏輯 我們這里 使用的是 redis 作為驅(qū)動(dòng)

驅(qū)動(dòng)設(shè)置為 Redis

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

快速創(chuàng)建隊(duì)列 和 投遞任務(wù)

# 創(chuàng)建 任務(wù)
php artisan make:job ProcessPodcast

自動(dòng)生成 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();

        // ... 檢查當(dāng)前可用 Mailer
        // 這里你自定義就好了,這個(gè)方法中你可以根據(jù)你自己的配置,獲取到當(dāng)前可用的配置
        $mailer = $service->getMailer();

        // ... 獲取當(dāng)前要發(fā)送的數(shù)據(jù)
        $data = $this->data;
        
        $service->send($mailer, $data);
    }
}

一些常用操作

這些操作都能從 文檔中找到

調(diào)用 發(fā)送

# 延遲 2分鐘 發(fā)送
# 這里使用的是 Crontab 包 (不過 Laravel 自帶)
EmailJob::dispatch()->delay(now()->addMinutes(2));

# 立即發(fā)送 (不會(huì)進(jìn)入到隊(duì)列中)
EmailJob::dispatchNow();

這里的隊(duì)列默認(rèn)用的 是 defult 隊(duì)列,我們可以修改為指定隊(duì)列服務(wù)

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

設(shè)置失敗情況下重試次數(shù)

# 重試 5 次
public $tries = 5;

設(shè)置超時(shí)時(shí)間

/**
* 確定任務(wù)應(yīng)該超時(shí)的時(shí)間
*
* @return \DateTime
*/
public function retryUntil()
{
    return now()->addMinutes(10);
}

啟動(dòng)我們的隊(duì)列

如果不配置 onQueue 的話,可以不帶 ---queue 參數(shù)配置

php artisan queue:work --queue=emailQueue

結(jié)合 Events 來解耦

Laravel Event 也是通過 隊(duì)列實(shí)現(xiàn)的

# 創(chuàng)建 Event
php artisan make:event FailEvent

class FailEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    protected $data;
    protected $tag;

    /**
     * @param array $data 投遞的數(shù)據(jù)
     * @param string $tag 要操作的事情
     */
    public function __construct(array $data, string $tag = 'system')
    {
        $this->data = $data;
        $this->tag = $tag;
    }
}

# 創(chuàng)建 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);
    }

    /**
     * 處理系統(tǒng)異常
     * 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'));

其他

其實(shí),Laravel 大多數(shù)幫我實(shí)現(xiàn)了整個(gè)流程而已??梢試L試自己使用 redis 來實(shí)現(xiàn)一個(gè)可控隊(duì)列。熟練是掌握 Redis 相關(guān)數(shù)據(jù)類型即可. 這里簡(jiǎn)要列出 Redis 中,在以上模式中會(huì)用到的數(shù)據(jù)類型

  • List

    使用 它可以完成 出棧 入棧的 隊(duì)列功能

  • Hash

    使用他 可以用來存儲(chǔ),序列化后的 Event或者 Job __construct傳入進(jìn)去的數(shù)據(jù),盡量不要將整個(gè) 類 序列化進(jìn)去

    也可以實(shí)現(xiàn)存儲(chǔ),Mailer 數(shù)據(jù)

  • Sorted Set

    可以 設(shè)置時(shí)間為 Sorted Set中的分?jǐn)?shù),通過分?jǐn)?shù)排序,找到我們最近要執(zhí)行的隊(duì)列任務(wù)

當(dāng)然,Redis 的用法還有很多,滿足自己的需求即可。

世界上沒有完美的解決方案,只有最適合你自己的方案,在工作中遇到問題,盡量要學(xué)會(huì)舉一反三,合理的運(yùn)用各種 工具,設(shè)計(jì)方案去實(shí)現(xiàn)。 代碼 只是最終一個(gè)縮影而已,最終的要學(xué)會(huì)理解,每個(gè)語言 每個(gè)框架,也只是一種方案的實(shí)現(xiàn),融會(huì)貫通才無敵 ...

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Laravel的隊(duì)列機(jī)制怎么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

文章題目:Laravel的隊(duì)列機(jī)制怎么用
路徑分享:http://bm7419.com/article36/jdcgpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、App開發(fā)關(guān)鍵詞優(yōu)化、企業(yè)建站、響應(yīng)式網(wǎng)站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)