MQ,網際網路架構解耦神器

2022-05-05 11:09:11 字數 1344 閱讀 3569

乙個架構常識:當呼叫方需要關心執行結果,通常使用rpc呼叫。

ret = passportservice::userauth(name, pass);

switch(ret){

case(yes) : return yeshtml();

case(no) : return nohtml();

case(jump) : return 304html():

default : return 500html();

登入頁面呼叫passport服務,會根據passport服務的返回結果,區別執行登入成功,登入失敗,執行錯誤。呼叫方關注執行結果時,不宜使用mq通訊。

使用mq通訊,呼叫方不能直接告之使用者登入成功又或失敗,阻塞住等待mq通知**不但使得編碼複雜,還會引入訊息丟失的風險,中間多加入一層,多此一舉,基本沒有人這麼玩。

但如果呼叫方不關心執行結果,卻仍然使用rpc呼叫,會引發上下游極大的耦合與瓶頸。

場景還原

有乙個通用的上游服務,例如「帖子發布」服務,負責公司通用的帖子發布業務。有一些個性化的業務關心「使用者發布帖子」這個事件,例如:

使用者發布帖子後,大資料部門要更新使用者的畫像

使用者發布帖子後,資訊質量部門要非同步檢查帖子是否合規

招聘業務最近在做使用者促活,如果使用者發布的是招聘帖子,要增加積分

個性化下游關注這個事件,但下游對事件的執行結果,「帖子發布」服務卻並不關心,如果「帖子發布」服務通過rpc的方式去通知下游,就會有很大的問題。

耦合為何存在?

帖子發布服務,這本來應該是乙個非常基礎的服務,上游upper通過rpc呼叫將事件同步給事件關注業務方biz1/biz2/biz3:

一旦有新的業務需求要關注這個事件,修改**的是通用上游upper,此時通用服務的owner就在心裡罵娘了「為何有需求的是你,修改**的卻是我」

一旦業務側出問題,會影響上游通用基礎服務,此時通用服務的owner又在心裡罵娘了「我ca,穩定性的kpi,全被兄弟部門毀了」

一旦業務側介面公升級,上游基礎服務需要配合公升級,此時通用服務的owner可能又會抱怨「為何被動公升級的人總是我」

架構不合理,簡直痛不欲生。

如何解耦呢?

如果事件發出方不關心訂閱方的執行結果,不能用rpc,應該用mq。

mq能夠做到上下游物理上和邏輯上都解耦:

物理上解耦,增加mq之後,上游互不知道彼此的存在,不會建立物理連線了,大家都只與mq建立物理連線

邏輯上解耦,事件發布方甚至不用知道哪些下游訂閱了這個訊息,新增訊息的訂閱方只需要連線mq就行了,不需要上游關注

mq是乙個非常常見的物理上解耦、邏輯上也解耦的利器。

關注下游執行執行結果,用rpc;

不關注下游執行結果,用mq,不用rpc;

網際網路架構

網際網路架構,主要追求的是高可用,可擴充套件 這兩個特性 在這裡做了一些個人的總結,算是給2014年的工作做個總結。推陳出新 一定要做的,死守積累會逐漸丟失人才,但凡技術公司都會不斷更新技術 kiss原則 keep it stupid優秀的 都會很簡單,簡單理解,簡單更改,能把複雜的事情做簡單是一種...

網際網路架構

使用者在同一時間內大量的訪問伺服器,tomcat伺服器併發能力為 200 250左右 jvm調優為1000 硬體條件 物理伺服器處理能力 網路頻寬 2.1 分布式計算 由多個執行緒,共同來完成某項特定的任務,拆合問題 2.2 分布式系統 distributed system 是建立在網路之上的軟體系...

大型網際網路架構概述

一 dns 1 當使用者在 瀏覽器中輸入 位址 後,瀏覽器會檢查 瀏覽器快取 中是否存在對應 網域名稱的解析結果 如果有,則解析過程結束 否則進入下乙個步驟 2 瀏覽器查詢 作業系統快取 中是否存在這個 網域名稱的解析結果 這個快取的內容 就是作業系統的 hosts檔案 如果有,則解析過程結束 否則...