laravel為什么用隊(duì)列

laravel中,使用隊(duì)列可以解決大并發(fā)和多種語言通信接口等問題。可以將耗時(shí)的任務(wù)或者不能同時(shí)大量并行的任務(wù)封裝起來傳輸?shù)较㈥?duì)列中,由處理程序不斷從消息隊(duì)列中提取消息并進(jìn)行處理,這樣用過消息隊(duì)列就可以使得在大并發(fā)情況下不再堵塞。

laravel為什么用隊(duì)列

本文操作環(huán)境:Windows10系統(tǒng)、Laravel6版、Dell G3電腦。

laravel為什么用隊(duì)列

消息隊(duì)列對(duì)于大型的Web項(xiàng)目來說是必不可少的一個(gè)模塊,通過消息隊(duì)列可以解決大并發(fā)和多種語言通信接口等問題。

對(duì)于大并發(fā)的問題,可以將耗時(shí)的任務(wù)或者不能同時(shí)大量并行的任務(wù)封裝起來傳輸?shù)较㈥?duì)列中,由處理程序不斷從消息隊(duì)列中提取消息并進(jìn)行處理,這樣通過消息隊(duì)列的緩沖可以使得在大并發(fā)情況下不再阻塞,如果性能不夠用還可以添加多個(gè)處理任務(wù)從消息隊(duì)列中獲取消息進(jìn)行處理。

比如數(shù)據(jù)庫的操作,當(dāng)對(duì)數(shù)據(jù)庫的讀、寫操作過多時(shí)就會(huì)存在鎖表等問題,讀的問題可以通過緩存等方案解決,寫的問題就需要消息隊(duì)列來解決。

而且,在大型的Web項(xiàng)目開發(fā)中,很多情況下不可能通過一種語言實(shí)現(xiàn),需要發(fā)揮不同語言的優(yōu)勢(shì),比如php,雖然在理論意義上它可以做Web開發(fā)中的所有事情,但是有些問題用它解決效率將會(huì)非常低,比如實(shí)時(shí)socket連接和分布式事務(wù)處理等。

使用?Laravel?的消息隊(duì)列處理異步任務(wù),redis?作為隊(duì)列數(shù)據(jù)庫,Supervisor?監(jiān)控腳本異常中斷并自動(dòng)重啟,這是?Laravel?處理隊(duì)列任務(wù)的標(biāo)準(zhǔn)流程,但是實(shí)際中可能還會(huì)出現(xiàn)各種各樣的問題,為了保證系統(tǒng)可靠性,還要注意幾個(gè)問題。

一、執(zhí)行失敗重試次數(shù)設(shè)置

一定要設(shè)置任務(wù)執(zhí)行失敗重試次數(shù),避免無限失敗重試,超過重試次數(shù)?Laravel?會(huì)默認(rèn)寫到失敗任務(wù)表中,也可以自己寫執(zhí)行失敗后續(xù)處理邏輯。

php?artisan?queue:work?redis?–tries=3

需要先執(zhí)行以下命令創(chuàng)建數(shù)據(jù)表:

php?artisan?queue:failed-table

php?artisan?migrate

二、程序異常的處理

有時(shí)候程序執(zhí)行過程會(huì)發(fā)生異常,比如依賴其他接口,請(qǐng)求?http?接口超時(shí)等等,如果不捕捉異常,那么當(dāng)前這個(gè)隊(duì)列就會(huì)中斷不能繼續(xù)運(yùn)行下去,比如給?10000?個(gè)用戶推送內(nèi)容,需要依賴接口推送,如果中間的請(qǐng)求掛了就會(huì)影響到后面的推送。

這里的異常是指程序執(zhí)行過程中發(fā)生的異常,不是指常駐進(jìn)程掛掉,程序異常不一定導(dǎo)致常駐進(jìn)程中斷,況且進(jìn)程中斷有?Supervisor?監(jiān)控并重啟。

如捕獲異常代碼片段:

try?{undefined $r?=?$client->request('POST',?'',?[ 'query'?=>?[ 'client_name'?=>?'filemail', 'client_version'?=>?'1.0', 'client_sequence'?=>?0, 'uid'?=>?692934013,//119481237 'r'?=>?1508312484, ], 'body'?=>?GuzzleHttpjson_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()); }

【相關(guān)推薦:laravel視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享