欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          聊聊 Laravel 的隊(duì)列機(jī)制,了解一下隊(duì)列的使用場景

          如何使用 Laravel 隊(duì)列?下面由Laravel教程欄目給大家介紹一下使用 Laravel 隊(duì)列的方法,以及使用隊(duì)列的場景,希望對大家有所幫助!

          聊聊 Laravel 的隊(duì)列機(jī)制,了解一下隊(duì)列的使用場景

          為什么 ?

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

          我們可以舉例 幾個簡單場景。

          郵件發(fā)送

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

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

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

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

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

          • 提高容錯能力

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

            • 發(fā)送失敗
            • 郵件記錄入庫
            • 代碼異常
            • 郵件發(fā)送成功回調(diào)
            • 發(fā)送失敗重試

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

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

          • 發(fā)送頻率可控

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

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

          其他

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

          • 服務(wù)器端下載 excel
          • 服務(wù)器端異步多任務(wù)處理 大數(shù)據(jù)
          • 錯誤消息處理

          如何使用 Laravel 隊(duì)列

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

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

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

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

          # 創(chuàng)建 任務(wù) 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();          // ... 檢查當(dāng)前可用 Mailer         // 這里你自定義就好了,這個方法中你可以根據(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ā)送 (不會進(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è)置超時時間

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

          啟動我們的隊(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)了整個流程而已??梢試L試自己使用 redis 來實(shí)現(xiàn)一個可控隊(duì)列。熟練是掌握 Redis 相關(guān)數(shù)據(jù)類型即可. 這里簡要列出 Redis 中,在以上模式中會用到的數(shù)據(jù)類型

          • List

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

          • Hash

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

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

          • Sorted Set

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

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

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

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號