<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為什么說,MQ,是互聯(lián)網(wǎng)架構(gòu)的解耦神器?

          共 1732字,需瀏覽 4分鐘

           ·

          2021-08-29 06:10

          什么是耦合?
          耦合,是架構(gòu)中,本來不相干的代碼、模塊、服務(wù)、系統(tǒng)因?yàn)槟承┰蚵?lián)系在一起,各自獨(dú)立性差影響則相互影響變動(dòng)則相互變動(dòng)的一種架構(gòu)狀態(tài)。

          感官上,怎么發(fā)現(xiàn)系統(tǒng)中的耦合?
          作為技術(shù)人,每每在心中罵上下游,罵兄弟部門,“這個(gè)東西跟我有什么關(guān)系?為什么需要我來配合做這個(gè)事情?”。明明不應(yīng)該聯(lián)動(dòng),卻要被動(dòng)配合,就可能有潛在的耦合。
           
          今天一起來看一個(gè),用錯(cuò)RPC的耦合場(chǎng)景

          一個(gè)架構(gòu)常識(shí)當(dāng)調(diào)用方需要關(guān)心執(zhí)行結(jié)果,通常使用RPC調(diào)用

          ret = PassportService::userAuth(name, pass);

          switch(ret){

           case(YES) : return YesHTML();

           case(NO) : return NoHTML();

           case(JUMP) : return 304HTML():

           default : return 500HTML();

          }

           
          上一篇《明明服務(wù)化了,為啥耦合更加嚴(yán)重了?》提到,執(zhí)行結(jié)果的處理和業(yè)務(wù)強(qiáng)相關(guān),則switch case應(yīng)該放在上游業(yè)務(wù)方,而不應(yīng)該放到底層通用服務(wù)
           
          登錄頁面調(diào)用passport服務(wù),會(huì)根據(jù)passport服務(wù)的返回結(jié)果,區(qū)別執(zhí)行登錄成功,登錄失敗,執(zhí)行錯(cuò)誤。調(diào)用方關(guān)注執(zhí)行結(jié)果時(shí),不宜使用MQ通訊
          如果強(qiáng)行使用MQ通訊,調(diào)用方不能直接告之用戶登錄成功又或失敗,阻塞住等待MQ通知回調(diào)不但使得編碼復(fù)雜,還會(huì)引入消息丟失的風(fēng)險(xiǎn),中間多加入一層,多此一舉,基本沒有人這么玩。
           
          但如果調(diào)用方不關(guān)心執(zhí)行結(jié)果,卻仍然使用RPC調(diào)用,會(huì)引發(fā)上下游極大的耦合與瓶頸
           
          場(chǎng)景還原
          有一個(gè)通用的上游服務(wù),例如“帖子發(fā)布”服務(wù),負(fù)責(zé)公司通用的帖子發(fā)布業(yè)務(wù)。有一些個(gè)性化的業(yè)務(wù)關(guān)心“用戶發(fā)布帖子”這個(gè)事件,例如:
          (1)用戶發(fā)布帖子后,大數(shù)據(jù)部門要更新用戶的畫像;
          (2)用戶發(fā)布帖子后,信息質(zhì)量部門要異步檢查帖子是否合規(guī);
          (3)招聘業(yè)務(wù)最近在做用戶促活,如果用戶發(fā)布的是招聘帖子,要增加積分;
          (4)…
           
          個(gè)性化下游關(guān)注這個(gè)事件,但下游對(duì)事件的執(zhí)行結(jié)果,“帖子發(fā)布”服務(wù)卻并不關(guān)心,如果“帖子發(fā)布”服務(wù)通過RPC的方式去通知下游,就會(huì)有很大的問題
           
          耦合為何存在?
          帖子發(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è)出問題會(huì)影響上游通用基礎(chǔ)服務(wù),此時(shí)通用服務(wù)的owner又在心里罵娘了“我ca,穩(wěn)定性的KPI,全被兄弟部門毀了”;
          (3)一旦業(yè)務(wù)側(cè)接口升級(jí),上游基礎(chǔ)服務(wù)需要配合升級(jí),此時(shí)通用服務(wù)的owner可能又會(huì)抱怨“為何被動(dòng)升級(jí)的人總是我”;

          架構(gòu)不合理,簡(jiǎn)直痛不欲生。

          如何解耦呢?
          如果事件發(fā)出方不關(guān)心訂閱方的執(zhí)行結(jié)果,不能用RPC,應(yīng)該用MQ
          MQ能夠做到上下游物理上邏輯上都解耦
          (1)物理上解耦,增加MQ之后,上游互不知道彼此的存在,不會(huì)建立物理連接了,大家都只與MQ建立物理連接;
          (2)邏輯上解耦,事件發(fā)布方甚至不用知道哪些下游訂閱了這個(gè)消息,新增消息的訂閱方只需要連接MQ就行了,不需要上游關(guān)注;

          MQ是一個(gè)非常常見的物理上解耦、邏輯上也解耦的利器。
           
          關(guān)注下游執(zhí)行執(zhí)行結(jié)果,用RPC。
          不關(guān)注下游執(zhí)行結(jié)果,用MQ,不用RPC。
          這只是一個(gè)很小的優(yōu)化點(diǎn),但對(duì)于通知解耦卻是非常有效。
           
          希望每天收獲一點(diǎn)點(diǎn),架構(gòu)就能美好一點(diǎn)點(diǎn)。
          調(diào)研
          你被迫實(shí)現(xiàn)過本不應(yīng)該你來實(shí)現(xiàn)的需求么

          相關(guān)文章
          我C,一個(gè)庫(kù)里幾百個(gè)表,這誰受得了?
          我去,拷貝代碼,居然還有這等好處?
          沒錢就是沒錢,那不是吃苦
          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲在线成人视频 | 黄色片成年人免费的 | 人操人人射人 | 日本成人无码一本道视频 | 国内精品无码 |