消息隊列queue


前言 

  最近在做一個項目,做項目的過程中遇到了要使用queue的場景,芳哥跟我說,這個你可以用隊列來實現。我想了想,嗯?隊列,隊列不就是先進先出的哪一種嗎?后來翻看laravel文檔發現,原來queue並不是我所想的數據結構的隊列,而是另外一種東西。

 

正文

1. 為什么要用queue?

  比如有大量的請求一下發過來,服務器來不及處理,而用戶急需回應,這個時候你就需要先給用戶回應,然后慢慢的去處理這些請求。在這個項目中,因為涉及到文件上傳,如果單線程執行的話,系統資源沒有充分被利用,而且刷新目錄的時候,要等文件上傳完才會出現完整的目錄結構,對於用戶來說體驗不是很友好,所以就使用queue來處理了。

2. 怎么使用queue?

  隊列的思想就是先把待執行的任務存下來,然后你再啟用服務,去執行這些隊列里的任務。

  (1)連接

     所謂的連接就是你把這些任務存在哪里,一般可以存在數據庫中,redis中。

     config/queue.php 配置文件里,有一個 connections 配置選項。這個選項給 Amazon SQS,Beanstalk,或者 Redis 這樣的后端服務定義了一個特有的連接。不管是哪一種,一個給定的連接可能會有多個 「隊列」,而 「隊列」 可以被認為是不同的棧或者大量的隊列任務。

   queue 配置文件中每個連接的配置示例中都包含一個 queue 屬性。這是默認隊列任務被發給指定連接的時候會被分發到這個隊列中。換句話說,如果你分發任務的時候沒有顯式定義隊列,那么它就會被放到連接配置中 queue 屬性所定義的隊列中:

// 這個任務將被分發到默認隊列... Job::dispatch(); // 這個任務將被發送到「emails」隊列... Job::dispatch()->onQueue('emails');

設置超時時間:
<?php

namespace App\Jobs;

class ProcessPodcast implements ShouldQueue
{
    /**
     * 任務運行的超時時間。
     *
     * @var int
     */
    public $timeout = 120;
}

  指定隊列:

php artisan queue:work redis --queue=emails

如果你想多線程的話,可以多起幾個。

 

  

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM