在laravel中,使用佇列可以解決大並發和多種語言通訊介面等問題。可以將耗時的任務或不能同時大量並行的任務封裝起來傳送到訊息佇列中,由處理程序不斷從訊息佇列中提取訊息並進行處理,這樣用過訊息佇列就可以使得在大並發情況下不再堵塞。
本文操作環境:Windows10系統、Laravel6版、Dell G3電腦。
訊息佇列對於大型的Web專案來說是必不可少的一個模組,透過訊息佇列可以解決大並發和多種語言通訊介面等問題。
對於大並發的問題,可以將耗時的任務或不能同時大量並行的任務封裝起來傳輸到訊息佇列中,由處理程序不斷從訊息佇列中提取訊息並進行處理,這樣透過訊息佇列的緩衝可以使得在大並發情況下不再阻塞,如果效能不夠用還可以添加多個處理任務從訊息佇列中取得訊息進行處理。
例如資料庫的操作,當資料庫的讀取、寫入操作過多時就會有鎖定表等問題,讀取的問題可以透過快取等方案解決,寫的問題就需要訊息佇列來解決。
而且,在大型的Web專案開發中,很多情況下不可能透過一種語言實現,需要發揮不同語言的優勢,例如PHP,雖然在理論意義上它可以做Web開發中的所有事情,但是有些問題用它解決效率將會非常低,例如實時socket連接和分散式事務處理等。
使用 Laravel 的訊息佇列處理非同步任務,Redis 作為佇列資料庫,Supervisor 監控腳本異常中斷並自動重啟,這是 Laravel 處理佇列任務的標準流程,但實際中可能還會出現各種不同的問題,為了確保系統可靠性,還要注意幾個問題。
一、執行失敗重試次數設定
一定要設定任務執行失敗重試次數,避免無限失敗重試,超過重試次數 Laravel 會預設寫到失敗任務表中,也可以自己寫執行失敗後續處理邏輯。
php artisan queue:work redis --tries=3
需要先執行下列指令建立資料表:
php artisan queue:failed-table
php artisan migrate
二、程式異常的處理
有時候程式執行過程會發生異常,例如依賴其他介面,請求 HTTP 介面逾時等等,如果不捕捉異常,那麼目前這個佇列就會中斷不能繼續運作下去,例如給 10000 個使用者推送內容,需要依賴介面推送,如果中間的請求掛了就會影響到後面的推送。
這裡的異常是指程式執行過程中發生的異常,不是指常駐進程掛掉,程式異常不一定導致常駐進程中斷,況且進程中斷有 Supervisor 監控並重新啟動。
如捕獲異常代碼片段:
try {undefined $r = $client->request('POST', '', [ 'query' => [ 'client_name' => 'filemail', 'client_version' => '1.0', 'client_sequence' => 0, 'uid' => 692934013,//119481237 'r' => 1508312484, ], 'body' => \GuzzleHttp\json_encode($body), ]); $result = $r->getBody()->getContents(); $result = json_decode($result, true); if ($result['result'] == 0) {undefined info("sendMail fail:" . json_encode($result)); $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), 0); } else {undefined Log::warning("sendMail fail:" . json_encode($result)); $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), $result['result']); } } catch (RequestException $e) {undefined Log::warning('RequestException' . $e->getMessage()); } catch (Exception $e) {undefined Log::emergency('Exception' . $e->getMessage()); }
【相關推薦:laravel影片教學】
以上是laravel為什麼要用隊列的詳細內容。更多資訊請關注PHP中文網其他相關文章!