摘要:相信很多小伙伴都在開發(fā)中使用過消息隊(duì)列,尤其是高并發(fā)的情況,一般可以在緩存中操作數(shù)據(jù),然后通過消息異步處理業(yè)務(wù)邏輯,操作數(shù)據(jù)庫等。
相信很多小伙伴都在開發(fā)中使用過消息隊(duì)列,尤其是高并發(fā)的情況,一般可以在緩存中操作數(shù)據(jù),然后通過消息異步處理業(yè)務(wù)邏輯,操作數(shù)據(jù)庫等。
本人所在的公司使用了阿里云的消息隊(duì)列和RabbitMQ,據(jù)說使用阿里云消息隊(duì)列的一部分原因是RabbitMQ實(shí)現(xiàn)延遲消息比較復(fù)雜,要依賴死信...接下來進(jìn)入主題,說說我是怎么使用消息和遇到的坑吧~
一般來講,我們可以使用一個(gè)腳本來接收阿里云消息處理業(yè)務(wù)邏輯,但是如果業(yè)務(wù)量特別大的話,我們可能會(huì)遇到一個(gè)問題,就是腳本處理不過來,消息積攢的數(shù)量可能遠(yuǎn)遠(yuǎn)超出每秒能夠處理的數(shù)量。針對(duì)這種現(xiàn)象,我們可以啟動(dòng)多個(gè)處理腳本來同時(shí)處理消息,這樣會(huì)明顯加快處理消息的速度。
但是,多個(gè)腳本同時(shí)從一條消息隊(duì)列里面取消息的時(shí)候,會(huì)不會(huì)同時(shí)取到同一條消息,然后造成消息重復(fù)處理的現(xiàn)象呢?我覺得肯定是會(huì)的,消息是第三方服務(wù),我們無法保證他的100%穩(wěn)定,所以我們需要在處理的時(shí)候下點(diǎn)功夫了。
我們發(fā)送消息的數(shù)據(jù)體是json,一般我們會(huì)在每條消息里面加一個(gè)taskid,以時(shí)間戳(精確到毫秒級(jí)) + 隨機(jī)數(shù)組成,這個(gè)taskid足夠長(zhǎng),我們得以保證他不會(huì)重復(fù)(重復(fù)的可能性極小,類似于mongodb的主鍵也是這個(gè)原理)。
接下來看一段代碼:
try { //偽代碼 $getData = $mq->receive(); $getData = endJsonJson::decode($getData, true); //如果不是json數(shù)據(jù) 我們可以捕獲到異常 //先檢測(cè)數(shù)據(jù) $errorMsg = []; if (!isset($getData["taskid"]) || $getData["taskid"] == "") { $errorMsg[] = "taskid不能為空"; } if (!isset($getData["order_id"]) || $getData["order_id"] == "") { $errorMsg[] = "訂單號(hào)不能為空"; } if (!cache()->setex($this->cachePrefix . $getData["taskid"], 1)) { $errorMsg[] = "該任務(wù)已被處理"; } if (count($errorMsg) >= 1) { //記日志 方便排錯(cuò) $this->log("xxxx處理腳本錯(cuò)誤 哪個(gè)文件 錯(cuò)誤級(jí)別 錯(cuò)誤原因" . implode("|", $errorMsg)); return false; } //必須有過期時(shí)間 不然會(huì)把redis撐爆 cache()->expire($this->cachePrefix . $getData["taskid"], 7 * 86400); /** * 處理業(yè)務(wù)邏輯 */ //業(yè)務(wù)邏輯處理正常,刪除redis鎖,刪除消息 cache()->del($this->cachePrefix . $getData["taskid"]); $mq->ack(); return true; } //捕獲到了異常 catch (Exception $e) { //一定要把這次消息刪掉 不然會(huì)重復(fù)進(jìn)來 日志錯(cuò)誤級(jí)別記高一點(diǎn) 手動(dòng)處理問題 $mq->ack(); //記日志 $this->log(); }
小伙伴們知道這段代碼哪里有問題嗎?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30005.html
摘要:所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些面試和學(xué)習(xí)中你必須掌握的問題。在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。 昨天寫了一篇自己搭建redis集群并在自己項(xiàng)目中使用的文章,今天早上看別人寫的面經(jīng)發(fā)現(xiàn)redis在面試中還是比較常問的(筆主主Java方向)。所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些redis面試和學(xué)習(xí)中你必須掌握的問題。...
摘要:降級(jí)往往會(huì)指定不同的級(jí)別,面臨不同的異常等級(jí)執(zhí)行不同的處理。談?wù)勀銓?duì)和的認(rèn)識(shí)兩者關(guān)系具體可以看公眾號(hào)阿里巴巴中間件的這篇文章獨(dú)家解讀從微服務(wù)框架到微服務(wù)生態(tài)與并不是競(jìng)爭(zhēng)關(guān)系,作為成熟的框架,其易用性擴(kuò)展性和健壯性已得到業(yè)界的認(rèn)可。 該文已加入筆主的開源項(xiàng)目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)的文檔類項(xiàng)目),地址:https://github.com/...
摘要:降級(jí)往往會(huì)指定不同的級(jí)別,面臨不同的異常等級(jí)執(zhí)行不同的處理。談?wù)勀銓?duì)和的認(rèn)識(shí)兩者關(guān)系具體可以看公眾號(hào)阿里巴巴中間件的這篇文章獨(dú)家解讀從微服務(wù)框架到微服務(wù)生態(tài)與并不是競(jìng)爭(zhēng)關(guān)系,作為成熟的框架,其易用性擴(kuò)展性和健壯性已得到業(yè)界的認(rèn)可。 該文已加入筆主的開源項(xiàng)目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)的文檔類項(xiàng)目),地址:https://github.com/...
閱讀 2757·2021-10-26 09:50
閱讀 2402·2021-10-11 11:08
閱讀 2139·2019-08-30 15:53
閱讀 1915·2019-08-30 15:44
閱讀 2391·2019-08-28 18:12
閱讀 2532·2019-08-26 13:59
閱讀 2862·2019-08-26 12:19
閱讀 2762·2019-08-26 12:09