[筆記] 關於任務佇列在專案中的使用

JasonG發表於2018-09-15

本文總結來自 Web開發實戰進階:使用佇列

什麼時候使用佇列

處理一個需求中,屬於最佳化而非必須的功能時,可以使用佇列來完成。
佇列允許你非同步執行消耗時間的任務,這樣可以有效降低請求響應的時間。

1. 配置佇列

佇列的配置資訊儲存在 config/queue.php 中。
佇列的驅動包括:資料庫、Beanstalkd、Amazon SQS、Redis 和同步(本地使用)的驅動。宣告為 null 時表示不使用佇列任務。
本次教程中,使用 Redis 作為佇列驅動,需要先安裝相關依賴:

$ composer require "predis/predis:~1.0"

然後修改 .env 檔案中的環境變數 QUEUE_DRIVER 的值為 redis

失敗任務

佇列任務執行失敗後,會進行重試,當重試次數超過指定的任務重試最大次數後,會將失敗的任務資訊寫入 failed_jobs 表中。使用 php artisan queue:failed-table 指令來建立 failed_jobs 表的遷移檔案,隨後執行遷移。

$ php artisan queue:failed-table
$ php artisan migrate

2. 生成任務類

使用 make:job Artisan 指令來建立一個新的佇列任務,該指令會在 app/Jobs 下生成一個新的類

$ php artisan make:job JobName

該類會實現 Illuminate\Contracts\Queue\ShouldQueue 介面,該介面表明 Laravel 應該將任務新增到後臺的任務佇列中,而非同步執行。
引入 SerializesModels trait, Eloquent 模型會被優雅的序列化和反序列化。construct 將會序列化模型ID,執行任務時,會從資料庫中根據 ID 檢索出模型例項。
handle 方法將在任務執行時被呼叫。且為了避免出現模型監控器的死迴圈,我們要使用 DB 類直接對資料庫進行操作。

3. 任務分發

使用 dispatch 方法,可以將任務推送到佇列。

4. 佇列監控 Horizon

Horizon 是 Laravel 生態圈裡的一員,為 Laravel Redis 佇列提供了一個漂亮的儀表板,允許我們很方便地檢視和管理 Redis 佇列任務執行的情況。

使用 composer 安裝:

$ composer require "laravel/horizon:~1.0"

安裝完成後,使用 vendor:publish Artisan 命令釋出配置檔案 config/horizon.php 和存放在 public/vendor/horizon 資料夾中的CSS、JS 等頁面資原始檔。

$ php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

使用指令 php artisan horizon 即可監控佇列任務的執行,瀏覽器中開啟 http://larabbs.test/horizon 即可透過視覺化介面監控佇列任務的狀態。

線上部署

在生產環境使用佇列需要注意以下兩個問題:

  1. 使用 Supervisor 程式工具進行監控 php artisan horizon 指令的執行,以便程式意外退出時能自動重啟,配置和使用參照 Horizon文件

  2. 每一次部署程式碼時,需先執行 artisan horizon:terminate 然後再執行 artisan horizon 重新載入程式碼。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章