微服務(wù)中的耦合和自治

本文翻譯自 Gero Vermaas 在 voxxed 的博客文章,原文地址:

https://www.voxxed.com/blog/2015/04/coupling-versus-autonomy-in-microservices/

微服務(wù)是一種有望解決以前架構(gòu)風(fēng)格各種問(wèn)題的新架構(gòu)風(fēng)格度气。如同其他架構(gòu)風(fēng)格照棋,微服務(wù)也有其自身的挑戰(zhàn)牡整。本文討論的問(wèn)題是如何解除微服務(wù)之間的耦合并保持微服務(wù)盡可能的自治每辟,這里我們會(huì)討論四種方案并最終選擇一種岩四。

對(duì)我來(lái)說(shuō)礼殊,微服務(wù)是一種要對(duì)業(yè)務(wù)能力完全負(fù)責(zé)的自治服務(wù),這里的完全負(fù)責(zé)是指對(duì)表現(xiàn)層茸时、API贡定、數(shù)據(jù)存儲(chǔ)和業(yè)務(wù)邏輯完全負(fù)責(zé)。我覺得自治是微服務(wù)的關(guān)鍵可都,自治服務(wù)才會(huì)在修改時(shí)對(duì)其他部分造成盡可能小的影響缓待;自治服務(wù)運(yùn)營(yíng)時(shí)也不會(huì)對(duì)其他服務(wù)的功能造成影響。

聽起來(lái)不錯(cuò)渠牲,但是服務(wù)永遠(yuǎn)不會(huì)成為了一個(gè)與世隔絕的孤島旋炒,服務(wù)幾乎總是要依賴其他服務(wù)提供的數(shù)據(jù)。例如签杈,網(wǎng)上商城都有一個(gè)購(gòu)物車微服務(wù)瘫镇,一些其他服務(wù)必須能向購(gòu)物車添加商品,還必須能訪問(wèn)購(gòu)物車內(nèi)的商品并下單和配送∏酆荆現(xiàn)在問(wèn)題是汇四,如何在保持服務(wù)盡可能自治的前提下實(shí)現(xiàn)對(duì)接接奈。本文的目的是介紹幾種在保持微服務(wù)之間最大可能的自治前提下對(duì)接微服務(wù)需要遵循的模式踢涌。

我將從兩個(gè)維度構(gòu)建這些模式:交互模式和信息交換模式。

交互模式:Request-Reply 還是 Publish-Subscribe

Request-Reply vs. Publish-Subscribe
Request-Reply vs. Publish-Subscribe
  • Request-Reply(請(qǐng)求-應(yīng)答)意味著一個(gè)服務(wù)處理信息的特定請(qǐng)求或者執(zhí)行一些動(dòng)作并返回一個(gè)應(yīng)答序宦。發(fā)起調(diào)用的服務(wù)需要知道去哪兒請(qǐng)求以及請(qǐng)求些什么睁壁?這種模式仍然可以被實(shí)現(xiàn)為異步執(zhí)行,并且你還可以做一些抽象使服務(wù)調(diào)用方不需要知道被調(diào)用服務(wù)的物理地址互捌,不能逃避的一點(diǎn)是服務(wù)必須明確的要求一個(gè)特定的信息和功能(或者執(zhí)行動(dòng)作)并等待應(yīng)答潘明。
  • Publish-Subscribe(發(fā)布-訂閱) 這種模式下的服務(wù)將自己注冊(cè)為對(duì)特定的信息感興趣,或者能夠處理特定的請(qǐng)求秕噪,相關(guān)的信息和請(qǐng)求將被交付給它钳降,并且它可以決定怎么處理這些信息和請(qǐng)求。本文假定有一些中間件能夠處理交付或者發(fā)布消息給訂閱這些消息服務(wù)腌巾。

信息交換:Events 還是 Queries/Commands

  • Events(事件)是沒(méi)有爭(zhēng)議的事實(shí)遂填,比如訂單號(hào) 123 的訂單已經(jīng)創(chuàng)建,事件只陳述發(fā)生了什么事澈蝙,不描述這樣一個(gè)事件會(huì)導(dǎo)致什么事情發(fā)生吓坚。
  • Queries/Commands(查詢/命令)兩者都傳達(dá)了什么事情會(huì)發(fā)生,查詢是對(duì)信息的特定請(qǐng)求灯荧,命令是要求一個(gè)服務(wù)執(zhí)行一些動(dòng)作的特定請(qǐng)求礁击。

把這兩種維度組成矩陣就得到微服務(wù)間對(duì)接的四種方式。那么每種方式的優(yōu)勢(shì)和劣勢(shì)是什么?那種是保持服務(wù)最大化自治的最好方式哆窿?

以下的描述中我們將使用兩個(gè)服務(wù)來(lái)闡述每種方式链烈,訂單服務(wù)負(fù)責(zé)管理訂單,配送服務(wù)負(fù)責(zé)配送訂單里的商品挚躯。這些服務(wù)是網(wǎng)上商店的一部分测垛,網(wǎng)上商店還可能包含一些類似購(gòu)物車、商品目錄(搜索)等服務(wù)秧均。

1. REQUEST-REPLY WITH EVENTS

REQUEST-REPLY WITH EVENTS
REQUEST-REPLY WITH EVENTS

在這種模式下食侮,一個(gè)服務(wù)請(qǐng)求另一個(gè)導(dǎo)致事件發(fā)生的特定服務(wù),這意味著這兩種服務(wù)之間有很強(qiáng)的依賴目胡。配送服務(wù)必須知道要連接那個(gè)服務(wù)來(lái)獲得訂單相關(guān)的事件锯七,這也導(dǎo)致了運(yùn)行時(shí)依賴,因?yàn)榕渌头?wù)只有在訂單服務(wù)可用的時(shí)候才能配送新訂單誉己。
既然配送服務(wù)只接收事件眉尸,它基于事件里的信息自己決定何時(shí)一個(gè)訂單可以被配送,訂單服務(wù)不需要知道配送服務(wù)的任何信息巨双,它只是簡(jiǎn)單的提供事件表明當(dāng)其他服務(wù)請(qǐng)求時(shí)訂單進(jìn)行怎樣的處理噪猾,把響應(yīng)事件的職責(zé)完全交給請(qǐng)求事件的服務(wù)。

2. REQUEST-REPLY WITH COMMANDS/QUERIES

REQUEST-REPLY WITH COMMANDS/QUERIES
REQUEST-REPLY WITH COMMANDS/QUERIES

在這種模式下筑累,訂單服務(wù)將請(qǐng)求配送服務(wù)來(lái)配送一個(gè)訂單袱蜡,這意味著強(qiáng)烈的依賴,因?yàn)橛唵畏?wù)明確的請(qǐng)求一個(gè)特定的服務(wù)來(lái)處理配送慢宗,現(xiàn)在訂單服務(wù)必須決定何時(shí)一個(gè)訂單準(zhǔn)備好配送坪蚁,它意識(shí)到配送服務(wù)的存在,甚至知道怎樣與配送服務(wù)交互镜沽,在訂單配送前需要考慮是否有其他因素關(guān)聯(lián)到訂單(比如客戶信用卡狀態(tài))敏晤,訂單服務(wù)在請(qǐng)求配送服務(wù)來(lái)配送訂單前也需要考慮這一點(diǎn)。現(xiàn)在業(yè)務(wù)處理被混到了架構(gòu)里缅茉,因此架構(gòu)不能被簡(jiǎn)單的修改嘴脾。
這也是運(yùn)行時(shí)依賴,因?yàn)橛唵畏?wù)必須確保配送請(qǐng)求成功交付給了配送服務(wù)蔬墩。

3. PUBLISH-SUBSCRIBE WITH EVENTS

PUBLISH-SUBSCRIBE WITH EVENTS
PUBLISH-SUBSCRIBE WITH EVENTS

配送服務(wù)注冊(cè)自己對(duì)訂單相關(guān)的事件感興趣译打,注冊(cè)后,配送服務(wù)會(huì)收到訂單的所有事件而不需要關(guān)心訂單事件的來(lái)源筹我,這是對(duì)訂單事件來(lái)源的松散耦合扶平,配送服務(wù)需要保留接收到事件的副本,這樣就可以決定何時(shí)訂單準(zhǔn)備好配送蔬蕊。
訂單服務(wù)需要對(duì)配送無(wú)關(guān)结澄,如果多個(gè)服務(wù)提供包含配送服務(wù)需要的相關(guān)數(shù)據(jù)的訂單相關(guān)事件哥谷,配送服務(wù)應(yīng)該不可識(shí)別,如果一個(gè)提供訂單事件的服務(wù)宕機(jī)麻献,配送服務(wù)也應(yīng)該不知道们妥,只是收到的事件變少了,配送服務(wù)不會(huì)因此阻塞勉吻。

4. PUBLISH-SUBSCRIBE WITH COMMANDS/QUERIES

PUBLISH-SUBSCRIBE WITH COMMANDS/QUERIES
PUBLISH-SUBSCRIBE WITH COMMANDS/QUERIES

配送服務(wù)自己注冊(cè)為能夠配送貨物的服務(wù)监婶,接受所有想要配送貨物的命令,配送服務(wù)不需要意識(shí)到配送命令的來(lái)源齿桃,同樣訂單服務(wù)業(yè)不知道那些服務(wù)將處理配送惑惶,在這個(gè)意義上說(shuō),他們是松散耦合的短纵,不過(guò)带污,訂單服務(wù)知道既然發(fā)送了配送命令,訂單必須被配送的事實(shí)香到,這確實(shí)讓耦合更強(qiáng)了鱼冀。

結(jié)論

現(xiàn)在我們已經(jīng)描述了四種模式,讓我們回到原來(lái)的問(wèn)題悠就,那種方式更自治千绪?

兩種 Request-Reply 模式都意味著兩個(gè)服務(wù)的運(yùn)行時(shí)耦合和強(qiáng)耦合,兩種 Command/Queries 模式意味著一個(gè)服務(wù)知道另一個(gè)服務(wù)應(yīng)該做的事(我們的例子中訂單服務(wù)知道配送服務(wù)負(fù)責(zé)配送)梗脾,這也意味著強(qiáng)耦合荸型,但是這一次在功能級(jí)別。留下了一個(gè)選項(xiàng):Publish-Subscribe with Events藐唠,這種情況下帆疟,兩種服務(wù)從運(yùn)行時(shí)和功能的角度都沒(méi)有意識(shí)到彼此的存在鹉究。對(duì)我來(lái)說(shuō)這是實(shí)現(xiàn)服務(wù)之間最大的自主權(quán)的贏家宇立。

下一個(gè)問(wèn)題是 - 你應(yīng)該總是使用 Publish-Subscribe with Events?答案是肯定的自赔,但是我們需要考慮更多的因素妈嘹,一直使用這種方式交互是有代價(jià)的,例如绍妨,數(shù)據(jù)被復(fù)制润脸、事件丟失、事件驅(qū)動(dòng)的架構(gòu)增加更多基礎(chǔ)設(shè)施的需求他去、額外的延遲毙驯。

在以后的文章中,我將深入到這些權(quán)衡和正確看待這個(gè)事情≡植猓現(xiàn)在爆价,記住 Publish-Subscribe with Events 是實(shí)現(xiàn)服務(wù)自治的良好基礎(chǔ)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铭段,隨后出現(xiàn)的幾起案子骤宣,更是在濱河造成了極大的恐慌,老刑警劉巖序愚,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憔披,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爸吮,警方通過(guò)查閱死者的電腦和手機(jī)芬膝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)形娇,“玉大人蔗候,你說(shuō)我怎么就攤上這事」∪恚” “怎么了锈遥?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)勘畔。 經(jīng)常有香客問(wèn)我所灸,道長(zhǎng),這世上最難降的妖魔是什么炫七? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任爬立,我火速辦了婚禮,結(jié)果婚禮上万哪,老公的妹妹穿的比我還像新娘侠驯。我一直安慰自己,他們只是感情好奕巍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布吟策。 她就那樣靜靜地躺著,像睡著了一般的止。 火紅的嫁衣襯著肌膚如雪檩坚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天诅福,我揣著相機(jī)與錄音匾委,去河邊找鬼。 笑死氓润,一個(gè)胖子當(dāng)著我的面吹牛赂乐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咖气,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挨措,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辐啄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起运嗜,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壶辜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后担租,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砸民,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年奋救,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岭参。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尝艘,死狀恐怖演侯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情背亥,我是刑警寧澤秒际,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站狡汉,受9級(jí)特大地震影響娄徊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盾戴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一寄锐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尖啡,春花似錦橄仆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至矛渴,卻和暖如春椎扬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背具温。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筐赔,地道東北人铣猩。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茴丰,于是被迫代替她去往敵國(guó)和親达皿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子天吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容