溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

中字頭 中建二局項(xiàng)目一期 aop

發(fā)布時(shí)間:2020-07-24 14:33:57 來(lái)源:網(wǎng)絡(luò) 閱讀:363 作者:變小火 欄目:移動(dòng)開(kāi)發(fā)

消息隊(duì)列場(chǎng)景簡(jiǎn)介
“ 消息 ”是在兩臺(tái)計(jì)算機(jī)間傳送的數(shù)據(jù)單位。消息可以非常簡(jiǎn)單,例如只包含文本字符串;也可以更復(fù)雜,可能包含嵌入對(duì)象。消息被發(fā)送到隊(duì)列中,“ 消息隊(duì)列 ”是在消息的傳輸過(guò)程中保存消息的 容器 。

在目前廣泛的Web應(yīng)用中,都會(huì)出現(xiàn)一種場(chǎng)景:在某一個(gè)時(shí)刻,網(wǎng)站會(huì)迎來(lái)一個(gè)用戶請(qǐng)求的高峰期(比如:淘寶的雙十一購(gòu)物狂歡節(jié),12306的春運(yùn)搶票節(jié)等),一般的設(shè)計(jì)中,用戶的請(qǐng)求都會(huì)被直接寫(xiě)入數(shù)據(jù)庫(kù)或文件中,在高并發(fā)的情形下會(huì)對(duì)數(shù)據(jù)庫(kù)服務(wù)器或文件服務(wù)器造成巨大的壓力,同時(shí)呢,也使響應(yīng)延遲加劇。這也說(shuō)明了,為什么我們當(dāng)時(shí)那么地抱怨和吐槽這些網(wǎng)站的響應(yīng)速度了。當(dāng)時(shí)2011年的京東圖書(shū)促銷(xiāo),曾一直出現(xiàn)在購(gòu)物車(chē)中點(diǎn)擊“購(gòu)買(mǎi)”按鈕后一直是“ Service is too busy ”,其實(shí)就是因?yàn)楫?dāng)時(shí)的 并發(fā)訪問(wèn)量過(guò)大,超過(guò)了系統(tǒng)的最大負(fù)載能力 。當(dāng)然,后邊,劉強(qiáng)東臨時(shí)購(gòu)買(mǎi)了不少服務(wù)器進(jìn)行擴(kuò)展以求增強(qiáng)處理并發(fā)請(qǐng)求的能力,還請(qǐng)了信息部的人員“喝茶”,現(xiàn)在京東已經(jīng)是超大型的網(wǎng)上商城了,我也有同學(xué)在京東成都研究院工作了。
使用消息隊(duì)列
從京東當(dāng)年的“Service is too busy”不難看出,高并發(fā)的用戶請(qǐng)求是網(wǎng)站成長(zhǎng)過(guò)程中必不可少的過(guò)程,也是一個(gè)必須要解決的難題。在眾多的實(shí)踐當(dāng)中,除了增加服務(wù)器數(shù)量配置服務(wù)器集群實(shí)現(xiàn)伸縮性架構(gòu)設(shè)計(jì)之外,異步操作也被廣泛采用。而異步操作中最核心的就是使用 消息隊(duì)列 ,通過(guò)消息隊(duì)列,將短時(shí)間高并發(fā)產(chǎn)生的事務(wù)消息存儲(chǔ)在消息隊(duì)列中,從而削平高峰期的并發(fā)事務(wù),改善網(wǎng)站系統(tǒng)的性能。在京東之類的電子商務(wù)網(wǎng)站促銷(xiāo)活動(dòng)中, 合理地使用消息隊(duì)列,可以有效地抵御促銷(xiāo)活動(dòng)剛開(kāi)始就開(kāi)始大量涌入的訂單對(duì)系統(tǒng)造成的沖擊 。
記得我在實(shí)習(xí)期間,成都市XXXX局的一個(gè)價(jià)格信息采集發(fā)布系統(tǒng)項(xiàng)目中有一個(gè)采集任務(wù)發(fā)布的模塊,其中每個(gè)任務(wù)都是一個(gè)事務(wù),這個(gè)事務(wù)中需要向數(shù)據(jù)庫(kù)中不斷地插入行,每個(gè)任務(wù)發(fā)布時(shí)都要往表中插入幾百行甚至幾千行的任務(wù)數(shù)據(jù)(比如價(jià)格采集日?qǐng)?bào),往往需要發(fā)布2-3年的任務(wù)數(shù)據(jù),每一天都是一個(gè)任務(wù),所以大約有2,3千行任務(wù)期號(hào)數(shù)據(jù),還要發(fā)給很多個(gè)區(qū)縣的監(jiān)測(cè)中心,因此數(shù)據(jù)庫(kù)寫(xiě)操作量很大,更別說(shuō)同時(shí)發(fā)布的并發(fā)操作),由于業(yè)務(wù)邏輯的處理比較復(fù)雜和往數(shù)據(jù)庫(kù)的寫(xiě)操作量交大,所以在沒(méi)有采用消息隊(duì)列時(shí)點(diǎn)擊“發(fā)布”按鈕后往往需要等待1分鐘左右的時(shí)間才提示“發(fā)布成功”,用戶體驗(yàn)極不友好。

這時(shí),我們就可以使用消息隊(duì)列的思想來(lái)重構(gòu)這個(gè)發(fā)布模塊,在用戶點(diǎn)擊“發(fā)布”按鈕后,系統(tǒng)只需要把往數(shù)據(jù)庫(kù)插入的這個(gè)事務(wù)信息插入到指定的任務(wù)發(fā)布消息隊(duì)列里邊去(入隊(duì)操作,這里一般有一臺(tái)獨(dú)立的消息隊(duì)列服務(wù)器來(lái)單獨(dú)存儲(chǔ)和處理),然后系統(tǒng)就可以立即對(duì)用戶的這個(gè)發(fā)布請(qǐng)求進(jìn)行響應(yīng)(比如給出一個(gè)發(fā)布成功的操作提示,這里暫不考慮消息隊(duì)列服務(wù)操作失敗的情形,如果失敗了,可以考慮采用給用戶發(fā)送郵件、短信或站內(nèi)消息,讓其重新進(jìn)行發(fā)布操作)。
隊(duì)列結(jié)構(gòu)
最后,消息隊(duì)列服務(wù)器中有一個(gè)進(jìn)程單獨(dú)對(duì)消息隊(duì)列進(jìn)行處理,首先判斷消息隊(duì)列中是否有待處理的消息,如果有,則將其取出(出隊(duì)操作,堅(jiān)持“先進(jìn)先出”的順序,保證事務(wù)的準(zhǔn)確性)進(jìn)行相應(yīng)地處理(比如這里是進(jìn)行保存數(shù)據(jù)的操作,將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)服務(wù)器中的指定數(shù)據(jù)庫(kù)里邊,實(shí)質(zhì)還是文件的IO操作)。就這樣,通過(guò)消息隊(duì)列將高并發(fā)用戶請(qǐng)求進(jìn)行異步操作,然后一一對(duì)消息隊(duì)列進(jìn)行出隊(duì)的同步操作,也避免了并發(fā)控制的難題。
說(shuō)到這里,大家可能會(huì)想到這尼瑪不就是 生產(chǎn)者消費(fèi)者模式 么?對(duì)的,么么嗒,消息隊(duì)列就是生產(chǎn)者消費(fèi)者模式的典型場(chǎng)景。簡(jiǎn)單地說(shuō),客戶端不同用戶發(fā)送的操作請(qǐng)求就是生產(chǎn)者,他們將要處理的事務(wù)存儲(chǔ)到消息隊(duì)列中,然后消息隊(duì)列服務(wù)器的某個(gè)進(jìn)程不停地將要處理的單個(gè)事務(wù)從消息隊(duì)列中一個(gè)一個(gè)地取出來(lái)進(jìn)行相應(yīng)地處理,這就是消費(fèi)者消費(fèi)的過(guò)程。
下面我們將以異常日志為案例,介紹在.Net中如何采用消息隊(duì)列的思想解決并發(fā)問(wèn)題。當(dāng)然,消息隊(duì)列只是解決并發(fā)問(wèn)題的其中一種方式,在實(shí)際中往往需要結(jié)合多種不同的技術(shù)方式來(lái)共同解決,比如負(fù)載均衡、反向代理、集群等方案。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI