新聞中心
消息隊列場景簡介
“ 消息 ”是在兩臺計算機(jī)間傳送的數(shù)據(jù)單位。消息可以非常簡單,例如只包含文本字符串;也可以更復(fù)雜,可能包含嵌入對象。消息被發(fā)送到隊列中,“ 消息隊列 ”是在消息的傳輸過程中保存消息的 容器 。
在目前廣泛的Web應(yīng)用中,都會出現(xiàn)一種場景:在某一個時刻,網(wǎng)站會迎來一個用戶請求的高峰期(比如:淘寶的雙十一購物狂歡節(jié),12306的春運搶票節(jié)等),一般的設(shè)計中,用戶的請求都會被直接寫入數(shù)據(jù)庫或文件中,在高并發(fā)的情形下會對數(shù)據(jù)庫服務(wù)器或文件服務(wù)器造成巨大的壓力,同時呢,也使響應(yīng)延遲加劇。這也說明了,為什么我們當(dāng)時那么地抱怨和吐槽這些網(wǎng)站的響應(yīng)速度了。當(dāng)時2011年的京東圖書促銷,曾一直出現(xiàn)在購物車中點擊“購買”按鈕后一直是“ Service is too busy ”,其實就是因為當(dāng)時的 并發(fā)訪問量過大,超過了系統(tǒng)的大負(fù)載能力 。當(dāng)然,后邊,劉強(qiáng)東臨時購買了不少服務(wù)器進(jìn)行擴(kuò)展以求增強(qiáng)處理并發(fā)請求的能力,還請了信息部的人員“喝茶”,現(xiàn)在京東已經(jīng)是超大型的網(wǎng)上商城了,我也有同學(xué)在京東成都研究院工作了。
使用消息隊列
從京東當(dāng)年的“Service is too busy”不難看出,高并發(fā)的用戶請求是網(wǎng)站成長過程中必不可少的過程,也是一個必須要解決的難題。在眾多的實踐當(dāng)中,除了增加服務(wù)器數(shù)量配置服務(wù)器集群實現(xiàn)伸縮性架構(gòu)設(shè)計之外,異步操作也被廣泛采用。而異步操作中最核心的就是使用 消息隊列 ,通過消息隊列,將短時間高并發(fā)產(chǎn)生的事務(wù)消息存儲在消息隊列中,從而削平高峰期的并發(fā)事務(wù),改善網(wǎng)站系統(tǒng)的性能。在京東之類的電子商務(wù)網(wǎng)站促銷活動中, 合理地使用消息隊列,可以有效地抵御促銷活動剛開始就開始大量涌入的訂單對系統(tǒng)造成的沖擊 。
記得我在實習(xí)期間,成都市XXXX局的一個價格信息采集發(fā)布系統(tǒng)項目中有一個采集任務(wù)發(fā)布的模塊,其中每個任務(wù)都是一個事務(wù),這個事務(wù)中需要向數(shù)據(jù)庫中不斷地插入行,每個任務(wù)發(fā)布時都要往表中插入幾百行甚至幾千行的任務(wù)數(shù)據(jù)(比如價格采集日報,往往需要發(fā)布2-3年的任務(wù)數(shù)據(jù),每一天都是一個任務(wù),所以大約有2,3千行任務(wù)期號數(shù)據(jù),還要發(fā)給很多個區(qū)縣的監(jiān)測中心,因此數(shù)據(jù)庫寫操作量很大,更別說同時發(fā)布的并發(fā)操作),由于業(yè)務(wù)邏輯的處理比較復(fù)雜和往數(shù)據(jù)庫的寫操作量交大,所以在沒有采用消息隊列時點擊“發(fā)布”按鈕后往往需要等待1分鐘左右的時間才提示“發(fā)布成功”,用戶體驗極不友好。
這時,我們就可以使用消息隊列的思想來重構(gòu)這個發(fā)布模塊,在用戶點擊“發(fā)布”按鈕后,系統(tǒng)只需要把往數(shù)據(jù)庫插入的這個事務(wù)信息插入到指定的任務(wù)發(fā)布消息隊列里邊去(入隊操作,這里一般有一臺獨立的消息隊列服務(wù)器來單獨存儲和處理),然后系統(tǒng)就可以立即對用戶的這個發(fā)布請求進(jìn)行響應(yīng)(比如給出一個發(fā)布成功的操作提示,這里暫不考慮消息隊列服務(wù)操作失敗的情形,如果失敗了,可以考慮采用給用戶發(fā)送郵件、短信或站內(nèi)消息,讓其重新進(jìn)行發(fā)布操作)。
隊列結(jié)構(gòu)
最后,消息隊列服務(wù)器中有一個進(jìn)程單獨對消息隊列進(jìn)行處理,首先判斷消息隊列中是否有待處理的消息,如果有,則將其取出(出隊操作,堅持“先進(jìn)先出”的順序,保證事務(wù)的準(zhǔn)確性)進(jìn)行相應(yīng)地處理(比如這里是進(jìn)行保存數(shù)據(jù)的操作,將數(shù)據(jù)插入到數(shù)據(jù)庫服務(wù)器中的指定數(shù)據(jù)庫里邊,實質(zhì)還是文件的IO操作)。就這樣,通過消息隊列將高并發(fā)用戶請求進(jìn)行異步操作,然后一一對消息隊列進(jìn)行出隊的同步操作,也避免了并發(fā)控制的難題。
說到這里,大家可能會想到這尼瑪不就是 生產(chǎn)者消費者模式 么?對的,么么嗒,消息隊列就是生產(chǎn)者消費者模式的典型場景。簡單地說,客戶端不同用戶發(fā)送的操作請求就是生產(chǎn)者,他們將要處理的事務(wù)存儲到消息隊列中,然后消息隊列服務(wù)器的某個進(jìn)程不停地將要處理的單個事務(wù)從消息隊列中一個一個地取出來進(jìn)行相應(yīng)地處理,這就是消費者消費的過程。
下面我們將以異常日志為案例,介紹在.Net中如何采用消息隊列的思想解決并發(fā)問題。當(dāng)然,消息隊列只是解決并發(fā)問題的其中一種方式,在實際中往往需要結(jié)合多種不同的技術(shù)方式來共同解決,比如負(fù)載均衡、反向代理、集群等方案。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章題目:中字頭中建二局項目一期aop-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://www.dlmjj.cn/article/doihdj.html