主頁(yè) > 知識(shí)庫(kù) > Laravel使用消息隊(duì)列需要注意的一些問(wèn)題

Laravel使用消息隊(duì)列需要注意的一些問(wèn)題

熱門標(biāo)簽:專業(yè)電話機(jī)器人批發(fā)商 400電話辦理福州市 深圳外呼系統(tǒng)收費(fèi) 江蘇外呼電銷機(jī)器人報(bào)價(jià) 離石地圖標(biāo)注 400電話申請(qǐng)方法收費(fèi) 長(zhǎng)沙crm外呼系統(tǒng)業(yè)務(wù) 南寧高頻外呼回?fù)芟到y(tǒng)哪家好 電話機(jī)器人危險(xiǎn)嗎

前言

消息隊(duì)列對(duì)于大型的Web項(xiàng)目來(lái)說(shuō)是必不可少的一個(gè)模塊,通過(guò)消息隊(duì)列可以解決大并發(fā)和多種語(yǔ)言通信接口等問(wèn)題。對(duì)于大并發(fā)的問(wèn)題,可以將耗時(shí)的任務(wù)或者不能同時(shí)大量并行的任務(wù)封裝起來(lái)傳輸?shù)较㈥?duì)列中,由處理程序不斷從消息隊(duì)列中提取消息并進(jìn)行處理,這樣通過(guò)消息隊(duì)列的緩沖可以使得在大并發(fā)情況下不再阻塞,如果性能不夠用還可以添加多個(gè)處理任務(wù)從消息隊(duì)列中獲取消息進(jìn)行處理。比如數(shù)據(jù)庫(kù)的操作,當(dāng)對(duì)數(shù)據(jù)庫(kù)的讀、寫操作過(guò)多時(shí)就會(huì)存在鎖表等問(wèn)題,讀的問(wèn)題可以通過(guò)緩存等方案解決,寫的問(wèn)題就需要消息隊(duì)列來(lái)解決。而且,在大型的Web項(xiàng)目開發(fā)中,很多情況下不可能通過(guò)一種語(yǔ)言實(shí)現(xiàn),需要發(fā)揮不同語(yǔ)言的優(yōu)勢(shì),比如PHP,雖然在理論意義上它可以做Web開發(fā)中的所有事情,但是有些問(wèn)題用它解決效率將會(huì)非常低,比如實(shí)時(shí)socket連接和分布式事務(wù)處理等。

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

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

一定要設(shè)置任務(wù)執(zhí)行失敗重試次數(shù),避免無(wú)限失敗重試,超過(guò)重試次數(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í)行過(guò)程會(huì)發(fā)生異常,比如依賴其他接口,請(qǐng)求 HTTP 接口超時(shí)等等,如果不捕捉異常,那么當(dāng)前這個(gè)隊(duì)列就會(huì)中斷不能繼續(xù)運(yùn)行下去,比如給 10000 個(gè)用戶推送內(nèi)容,需要依賴接口推送,如果中間的請(qǐng)求掛了就會(huì)影響到后面的推送。

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

如捕獲異常代碼片段:

try {
 $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) {
  info("sendMail fail:" . json_encode($result));
  $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), 0);
 } else {
  Log::warning("sendMail fail:" . json_encode($result));
  $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), $result['result']);
 }
} catch (RequestException $e) {
 Log::warning('RequestException' . $e->getMessage());
} catch (Exception $e) {
 Log::emergency('Exception' . $e->getMessage());
}

三、修改代碼記得重啟 Supervisor

最后一點(diǎn),修改了處理隊(duì)列的程序,記得要重啟 Supervisor,否則腳本不會(huì)生效。

Laravel 往 Redis 寫隊(duì)列的數(shù)據(jù)結(jié)構(gòu)

隊(duì)列用 list 類型存儲(chǔ),如圖:

 

value 內(nèi)容如下:

{
 "job": "Illuminate\\Queue\\CallQueuedHandler@call",
 "data": {
 "commandName": "App\\Jobs\\SendFile",
 "command": "O:17:\"App\\Jobs\\SendFile\":5:{s:23:\"\u0000App\\Jobs\\SendFile\u0000task\";a:8:{s:5:\"title\";s:4:\"1111\";s:4:\"note\";s:2:\"11\";s:6:\"reward\";s:0:\"\";s:7:\"mail_id\";s:5:\"66681\";s:4:\"nums\";i:20;s:8:\"uid_file\";s:33:\"uidfile\/file-66681-1513058185.txt\";s:5:\"gcids\";s:40:\"1B9DD95645AAE8119F7DA9B9FF738D52BC8A1BD5\";s:2:\"id\";i:29;}s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";s:8:\"sendfile\";s:5:\"delay\";N;}"
 },
 "id": "l0mjsUthbxm4TgIJNUH13km9N8DIpErK",
 "attempts": 1
}

包含失敗重試次數(shù),隊(duì)列標(biāo)識(shí),處理隊(duì)列的類,以及隊(duì)列的數(shù)據(jù)等等。

參考鏈接

Laravel 官方文檔 Queue 隊(duì)列:

https://laravel.com/docs/5.5/queues

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • laravel5.6 框架郵件隊(duì)列database驅(qū)動(dòng)簡(jiǎn)單demo示例
  • Laravel使用Queue隊(duì)列的技巧匯總
  • Docker部署Laravel應(yīng)用實(shí)現(xiàn)隊(duì)列&任務(wù)調(diào)度
  • Laravel 6 將新增為指定隊(duì)列任務(wù)設(shè)置中間件的功能
  • Laravel 隊(duì)列使用的實(shí)現(xiàn)
  • Laravel框架隊(duì)列原理與用法分析
  • Laravel中為什么不使用blpop取隊(duì)列詳析
  • 關(guān)于 Laravel Redis 多個(gè)進(jìn)程同時(shí)取隊(duì)列問(wèn)題詳解
  • 源碼分析 Laravel 重復(fù)執(zhí)行同一個(gè)隊(duì)列任務(wù)的原因
  • Laravel中利用隊(duì)列發(fā)送郵件的方法示例
  • 淺談Laravel隊(duì)列實(shí)現(xiàn)原理解決問(wèn)題記錄
  • 淺析Laravel5中隊(duì)列的配置及使用
  • PHP的Laravel框架中使用消息隊(duì)列queue及異步隊(duì)列的方法
  • Laravel 4.2 中隊(duì)列服務(wù)(queue)使用感受
  • Laravel框架中隊(duì)列和工作(Queues、Jobs)操作實(shí)例詳解

標(biāo)簽:曲靖 興安盟 濱州 南京 太原 南昌 株洲 白酒營(yíng)銷

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Laravel使用消息隊(duì)列需要注意的一些問(wèn)題》,本文關(guān)鍵詞  Laravel,使用,消息,隊(duì)列,需要,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Laravel使用消息隊(duì)列需要注意的一些問(wèn)題》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Laravel使用消息隊(duì)列需要注意的一些問(wèn)題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章