消息隊列在企業(yè)中的應(yīng)用
消息服務(wù)蕉扮,是企業(yè)級服務(wù)體系中比較重要的一個組件整胃,它必須具有低延時、高可靠喳钟、可擴展等特性屁使,為業(yè)務(wù)提供基礎(chǔ)建設(shè)。
應(yīng)用消息服務(wù)的目的在于:異步奔则、削峰填谷蛮寂、解耦應(yīng)用。
最常用的MQ類型有:kafka易茬、rocketmq酬蹋、activemq、rabbitmq抽莱、zeromq范抓。
異步
在企業(yè)服務(wù)架構(gòu)中,自頂向下食铐,調(diào)用一個產(chǎn)品或者接口匕垫,需要經(jīng)過多層服務(wù)調(diào)用,有些服務(wù)的耗時長會使得整個應(yīng)用都被拖慢璃岳,因此年缎,我們可以把耗時操作異步化。
比如短信系統(tǒng)铃慷,統(tǒng)計發(fā)送列表并創(chuàng)建發(fā)送任務(wù)单芜,在統(tǒng)計的這個功能上耗時會比較長,所以我們可以設(shè)計一個任務(wù)機集群犁柜,消費消息隊列提供的統(tǒng)計參數(shù)洲鸠,然后將任務(wù)記錄到數(shù)據(jù)庫中,再由另一個流程查詢結(jié)果馋缅。
再比如扒腕,申請簽署文件這個業(yè)務(wù),前端發(fā)起簽署后生成簽署文件并展示給客戶簽署萤悴,在文檔生成這一塊就比較耗時瘾腰,所以我們采用了向簽署系統(tǒng)發(fā)送關(guān)鍵參數(shù)到消息隊列,并且流程異步化的操作覆履,在頁面上降低客戶對實時的預(yù)期蹋盆,流程上采用異步業(yè)務(wù)的方式。
還有硝全,對于數(shù)據(jù)收集的應(yīng)用栖雾,我們也采用了消息隊列對關(guān)鍵數(shù)據(jù)收集的功能,將業(yè)務(wù)產(chǎn)生的關(guān)鍵參數(shù)發(fā)送到消息隊列中伟众,然后由收集線程統(tǒng)一收集入庫析藕,這樣對業(yè)務(wù)來說既不占用業(yè)務(wù)的延時也能進行故障隔離,倘若消息隊列出來問題凳厢,我們的業(yè)務(wù)也不至于收到中斷的影響账胧,因為采用了線程池解耦了業(yè)務(wù)流程。
削峰填谷
另一個應(yīng)用場景数初,就是對大量的寫操作進行cache的一種思想找爱。互聯(lián)網(wǎng)項目中很多都是讀請求泡孩,但秒殺這種場景就會有很多寫請求车摄。秒殺場景下,比如100件商品是理論上只會update100次仑鸥,但是如果商品熱度很高吮播,就會有瞬間執(zhí)行update大大超過100次的情況,所以我們的方案是不能從頁面上直接透到數(shù)據(jù)庫的眼俊。
采用消息隊列緩存秒殺請求意狠,也是一種方案。
這樣消費服務(wù)以恒定的速率處理到數(shù)據(jù)庫中疮胖,就不會因為瞬時大流量而導(dǎo)致數(shù)據(jù)庫掛了环戈,在這個時候消息隊列的可靠性就凸顯了闷板,不能因為幾十萬的消息崩潰,也不能丟失太多的消息院塞。
服務(wù)解耦
服務(wù)解耦的作用遮晚,和異步有點類似,只不過異步是對于流程上的視角而言拦止,服務(wù)解耦則是服務(wù)視角上的县遣。
比如短信系統(tǒng),原本一體化的應(yīng)用是短信和統(tǒng)計在一起的汹族,進行微服務(wù)拆分之后萧求,就會使用消息隊列作為交互,把一些rpc調(diào)用的場景直接設(shè)計為服務(wù)間通過消息消費的方式顶瞒,就可以不在服務(wù)中大量寫入調(diào)用代碼夸政。
我們在一個身份校驗系統(tǒng)中采用過,一個身份校驗系統(tǒng)有一個流程id搁拙,每次這個流程id完成身份校驗之后秒梳,就會在消息隊列中一個virtual topic中廣播一條消息。需要訂閱的系統(tǒng)箕速,只需要消費這個virtual topic就好了酪碘,不需要再對接系統(tǒng)的結(jié)果查詢之類的接口,這樣就可以做到服務(wù)的解耦了盐茎。