在互聯(lián)網(wǎng)架構(gòu)中,MQ是一種非常常見的上下游“邏輯解耦+物理解耦”的消息通知服務(wù)葡粒。
什么時(shí)候不使用MQ份殿?
上游實(shí)時(shí)關(guān)注執(zhí)行結(jié)果,通常采用RPC嗽交。
什么時(shí)候使用MQ伯铣?
(1)數(shù)據(jù)驅(qū)動的任務(wù)依賴。
(2)上游不關(guān)心執(zhí)行結(jié)果轮纫。
(3)上游關(guān)注結(jié)果腔寡,但執(zhí)行時(shí)間很長。
(4)削峰填谷掌唾,流量控制放前,保護(hù)下游
場景1:不適宜用MQ通信
圖(1)MQ通信
圖(2)RPC調(diào)用
如上圖(1)所示,登錄頁面調(diào)用passport服務(wù)糯彬,會根據(jù)passport服務(wù)的返回結(jié)果凭语,區(qū)別執(zhí)行登錄成功,登錄失敗撩扒,執(zhí)行錯誤似扔。調(diào)用方關(guān)注執(zhí)行結(jié)果時(shí)吨些,不宜使用MQ通訊。使用MQ通訊炒辉,調(diào)用方不能直接告之用戶登錄成功又或失敗豪墅,阻塞住等待MQ通知回調(diào)不但使得編碼復(fù)雜,還會引入消息丟失的風(fēng)險(xiǎn)黔寇,中間多加入一層偶器,多此一舉,基本沒有人這么玩缝裤。MQ的不足:(1)系統(tǒng)更復(fù)雜屏轰,多了MQ組件(2)消息傳遞路徑長,延時(shí)會增加(3)消息可靠性和重復(fù)性相互矛盾憋飞,消息的不丟不重難以保證(4)上游無法知道下游執(zhí)行結(jié)果霎苗,這一點(diǎn)很致命場景2:如果調(diào)用方不關(guān)心執(zhí)行結(jié)果,卻仍然使用RPC調(diào)用榛做,會引發(fā)上下游極大的耦合與瓶頸叨粘。下游服務(wù)biz1:用戶發(fā)布帖子后驴党,大數(shù)據(jù)部門要更新用戶的畫像
下游服務(wù)biz2:用戶發(fā)布帖子后,信息質(zhì)量部門要異步檢查帖子是否合規(guī)
下游服務(wù)biz3:招聘業(yè)務(wù)最近在做用戶促活获茬,如果用戶發(fā)布的是招聘帖子港庄,要增加積分
…
個(gè)性化下游關(guān)注這個(gè)事件,但下游對事件的執(zhí)行結(jié)果恕曲,“帖子發(fā)布”服務(wù)卻并不關(guān)心鹏氧,如果“帖子發(fā)布”服務(wù)通過RPC的方式去通知下游,就會有很大的問題佩谣。
耦合為何存在把还?
帖子發(fā)布服務(wù),這本來應(yīng)該是一個(gè)非橙准螅基礎(chǔ)的服務(wù)吊履,上游upper通過RPC調(diào)用將事件同步給事件關(guān)注業(yè)務(wù)方biz1/biz2/biz3:
(1)一旦有新的業(yè)務(wù)需求要關(guān)注這個(gè)事件,修改代碼的是通用上游upper调鬓,此時(shí)通用服務(wù)的owner就在心里罵娘了“為何有需求的是你艇炎,修改代碼的卻是我”
(2)一旦業(yè)務(wù)側(cè)出問題,會影響上游通用基礎(chǔ)服務(wù)腾窝,此時(shí)通用服務(wù)的owner又在心里罵娘了“我ca缀踪,穩(wěn)定性的KPI居砖,全被兄弟部門毀了”
(3)一旦業(yè)務(wù)側(cè)接口升級,上游基礎(chǔ)服務(wù)需要配合升級驴娃,此時(shí)通用服務(wù)的owner可能又會抱怨“為何被動升級的人總是我”
架構(gòu)不合理奏候,簡直痛不欲生。
如何解耦呢托慨?
如果事件發(fā)出方不關(guān)心訂閱方的執(zhí)行結(jié)果鼻由,不能用RPC暇榴,應(yīng)該用MQ厚棵。
- 物理上解耦,增加MQ之后蔼紧,上游互不知道彼此的存在婆硬,不會建立物理連接了,大家都只與MQ建立物理連接
- 邏輯上解耦奸例,事件發(fā)布方甚至不用知道哪些下游訂閱了這個(gè)消息彬犯,新增消息的訂閱方只需要連接MQ就行了,不需要上游關(guān)注
- 上游執(zhí)行時(shí)間短查吊,它只需要向MQ發(fā)送一個(gè)異步的消息即可
- 上下游沒有物理谐区、邏輯上的依賴關(guān)系
- 下游只需要向MQ訂閱上游的執(zhí)行成功消息即可,增減下游上游都不要關(guān)心
面試方法論:
1. cap理論
CAP理論指的是一個(gè)分布式系統(tǒng)最多只能同時(shí)滿足一致性(Consistency)宋列、可用性(Availability)和分區(qū)容錯性(Partition tolerance)這三項(xiàng)中的兩項(xiàng)。結(jié)論:CAP三個(gè)特性肯定是不能同時(shí)滿足的评也,但是可以滿足其中兩個(gè)炼杖。要么滿足CP要么滿足AP。
我們分析一下既然可以滿足兩個(gè)盗迟,那么舍棄哪一個(gè)比較好呢坤邪?
(1)滿足CA舍棄P,也就是滿足一致性和可用性罚缕,舍棄容錯性艇纺。但是這也就意味著你的系統(tǒng)不是分布式的了,因?yàn)樯婕胺植际降南敕ň褪前压δ芊珠_邮弹,部署到不同的機(jī)器上喂饥。(既然是分布式,這就不可取了3辍T卑铩!)
(2)滿足CP舍棄A导饲,也就是滿足一致性和容錯性捞高,舍棄可用性氯材。如果你的系統(tǒng)允許有段時(shí)間的訪問失效等問題,這個(gè)是可以滿足的硝岗。就好比多個(gè)人并發(fā)買票氢哮,后臺網(wǎng)絡(luò)出現(xiàn)故障,你買的時(shí)候系統(tǒng)就崩潰了型檀。
(3)滿足AP舍棄C冗尤,也就是滿足可用性和容錯性,舍棄一致性胀溺。這也就是意味著你的系統(tǒng)在并發(fā)訪問的時(shí)候可能會出現(xiàn)數(shù)據(jù)不一致的情況裂七。
實(shí)時(shí)證明,大多數(shù)都是犧牲了一致性仓坞。像12306還有淘寶網(wǎng)背零,就好比是你買火車票,本來你看到的是還有一張票无埃,其實(shí)在這個(gè)時(shí)刻已經(jīng)被買走了徙瓶,你填好了信息準(zhǔn)備買的時(shí)候發(fā)現(xiàn)系統(tǒng)提示你沒票了。這就是犧牲了一致性嫉称。
但是不是說犧牲一致性一定是最好的侦镇。就好比mysql中的事務(wù)機(jī)制,張三給李四轉(zhuǎn)了100塊錢织阅,這時(shí)候必須保證張三的賬戶上少了100壳繁,李四的賬戶多了100。因此需要數(shù)據(jù)的一致性蒲稳,而且什么時(shí)候轉(zhuǎn)錢都可以氮趋,也需要可用性。但是可以轉(zhuǎn)錢失敗是可以允許的江耀。
END請毫不留情的點(diǎn)贊吧剩胁!