自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一句話說清:什么時(shí)候用 RPC,什么時(shí)候用 MQ

開發(fā) 架構(gòu)
MQ 是一個(gè)非常常見的物理上解耦、邏輯上也是解耦的利器:關(guān)注下游執(zhí)行執(zhí)行結(jié)果,用RPC;不關(guān)注下游執(zhí)行結(jié)果,用MQ,不用RPC。

很多人說,MQ是架構(gòu)解耦利器,能用MQ就不要用RPC,這個(gè)觀點(diǎn)對嗎?

什么時(shí)候用RPC?

當(dāng)調(diào)用方需要關(guān)心執(zhí)行結(jié)果,通常使用RPC調(diào)用。

登錄頁面調(diào)用passport服務(wù),會根據(jù)passport服務(wù)的返回結(jié)果,區(qū)別執(zhí)行登錄成功,登錄失敗,執(zhí)行錯(cuò)誤。

ret = PassportService::userAuth(name, pass);
switch(ret){
 case(YES) : return YesHTML();
 case(NO) : return NoHTML();
 case(JUMP) : return 304HTML():
 default : return 500HTML();
}

調(diào)用方關(guān)注執(zhí)行結(jié)果時(shí),使用RPC。

如果強(qiáng)行使用MQ進(jìn)行上下游解耦呢?

使用MQ通訊,調(diào)用方不能直接告之用戶登錄成功又或失敗,阻塞住等待MQ通知回調(diào)不但使得編碼復(fù)雜,還會引入消息丟失的風(fēng)險(xiǎn),中間多加入一層,多此一舉,基本沒有人這么玩。

那能否一律使用RPC調(diào)用呢?

不能。如果調(diào)用方不關(guān)心執(zhí)行結(jié)果,卻仍然使用RPC調(diào)用,會引發(fā)上下游極大的耦合與瓶頸。

場景還原

有一個(gè)通用的上游服務(wù),例如“帖子發(fā)布”服務(wù),負(fù)責(zé)公司通用的帖子發(fā)布業(yè)務(wù)。有一些個(gè)性化的業(yè)務(wù)關(guān)心“用戶發(fā)布帖子”這個(gè)事件,例如:

  • 用戶發(fā)布帖子后,大數(shù)據(jù)部門要更新用戶的畫像;
  • 用戶發(fā)布帖子后,信息質(zhì)量部門要異步檢查帖子是否合規(guī);
  • 招聘業(yè)務(wù)最近在做用戶促活,如果用戶發(fā)布的是招聘帖子,要增加積分;

個(gè)性化下游關(guān)注這個(gè)事件,但下游對事件的執(zhí)行結(jié)果,“帖子發(fā)布”服務(wù)卻并不關(guān)心,如果“帖子發(fā)布”服務(wù)通過RPC的方式去通知下游,就會有很大的問題。

耦合為何存在?

帖子發(fā)布服務(wù),這本來應(yīng)該是一個(gè)非?;A(chǔ)的服務(wù),上游upper通過RPC調(diào)用將事件同步給事件關(guān)注業(yè)務(wù)方biz1/biz2/biz3:

  • 一旦有新的業(yè)務(wù)需求要關(guān)注這個(gè)事件,修改代碼的是通用上游upper,此時(shí)通用服務(wù)的owner就在心里罵娘了“為何有需求的是你,修改代碼的卻是我”;
  • 一旦業(yè)務(wù)側(cè)出問題,會影響上游通用基礎(chǔ)服務(wù),此時(shí)通用服務(wù)的owner又在心里罵娘了“我ca,穩(wěn)定性的KPI,全被兄弟部門毀了”;
  • 一旦業(yè)務(wù)側(cè)接口升級,上游基礎(chǔ)服務(wù)需要配合升級,此時(shí)通用服務(wù)的owner可能又會抱怨“為何被動升級的人總是我”;

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

如何解耦呢?

如果事件發(fā)出方不關(guān)心訂閱方的執(zhí)行結(jié)果,不能用RPC,應(yīng)該用MQ。

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

  • 物理上解耦,增加MQ之后,上游互不知道彼此的存在,不會建立物理連接了,大家都只與MQ建立物理連接;
  • 邏輯上解耦,事件發(fā)布方甚至不用知道哪些下游訂閱了這個(gè)消息,新增消息的訂閱方只需要連接MQ就行了,不需要上游關(guān)注;

稍作總結(jié)

MQ是一個(gè)非常常見的物理上解耦、邏輯上也是解耦的利器:

  • 關(guān)注下游執(zhí)行執(zhí)行結(jié)果,用RPC;
  • 不關(guān)注下游執(zhí)行結(jié)果,用MQ,不用RPC;

這只是一個(gè)很小的優(yōu)化點(diǎn),但對于通知解耦卻是非常有效。

知其然,知其所以然。

思路比結(jié)論更重要。

責(zé)任編輯:趙寧寧 來源: 架構(gòu)師之路
相關(guān)推薦

2015-07-08 15:55:01

NSStringcopystrong

2020-01-05 23:28:51

MQ消息進(jìn)程

2017-04-05 21:43:08

MQ互聯(lián)網(wǎng)架構(gòu)

2020-05-12 11:25:50

MySQLES數(shù)據(jù)庫

2017-05-15 09:55:07

2015-08-03 10:21:04

設(shè)計(jì)模式表達(dá)

2013-11-28 16:03:24

2012-09-24 10:20:39

JavaScriptJS

2017-06-28 15:06:51

PythonLambda函數(shù)

2022-05-19 10:27:34

機(jī)器學(xué)習(xí)人工智能

2024-08-05 01:22:16

2021-08-13 11:31:23

HTTP

2020-03-06 09:35:06

Python疫情Excel

2021-01-30 19:59:37

性能項(xiàng)目開源

2023-06-06 16:54:00

2015-02-01 09:45:46

2015-03-02 14:44:48

AngularJS jQuery超越

2011-10-18 16:41:23

編程

2012-07-26 10:27:31

PHP

2021-09-29 09:24:21

GCGo STW
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號