成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

微服務壞味道之循環依賴

開發 架構
重構系統和重構代碼一樣,首先要先識別系統的壞味道,今天我們就來聊聊如何消滅其中的一個壞味道——循環依賴。

歷史上有很多科學家為之背書的熵增定律,揭示了很多自然界現象的本質:任何孤立系統,在沒有外力作用的情況下,其總混亂度(熵)會不斷增大。

軟件系統當然也不例外,隨著軟件系統的功能不斷增加,系統的混亂度也在不斷增大。為了降低軟件系統混亂的速度,必須要對其施以外力(重構)。

重構系統和重構代碼一樣,首先要先識別系統的壞味道,Davide Taibi和Valentina Lenarduzzi在文章《On the Definition of Microservice Bad Smells》中定義了微服務的壞味道,今天我們就來聊聊如何消滅其中的一個壞味道——循環依賴。

循環依賴的危害

微服務之間的循環依賴類似于類之間的循環依賴,當依賴關系形成了環,會有很多危害:

首先是微服務之間的耦合性非常強,服務很難做到獨立部署,這嚴重違反了微服務的初衷;這種情況往往是服務之間的調用沒有約束導致的,為了方便取到或更新數據,服務之間可以隨意的調用,以”微服務“為設計目標的系統會逐漸演變成一個分布式大單體,下圖展示了三個服務之間的循環依賴關系:

另外循環依賴很可能導致一些循環調用或并發問題,造成一些復雜難以定位的問題,以上圖中訂單和客戶的循環依賴為例:

訂單服務依賴客戶服務來獲取客戶信息,為了滿足可以根據客戶姓名查詢訂單的需求,除了記錄客戶的ID,同時將客戶的姓名冗余到訂單的數據中。當客戶信息更新時,為保證訂單上數據的準確,客戶服務會調用訂單服務更新訂單上的客戶信息。

循環依賴讓事情變得復雜,不同的實現會有不同的問題表現,我們來看這樣的場景:當訂單狀態變化時,客戶的狀態也要跟著變化,訂單服務會更新客戶的狀態,而客戶信息的變化反過來需要更新訂單上冗余的客戶信息;假設在訂單上加了樂觀鎖,同一時刻的兩次訂單更新因為樂觀鎖會有一個失敗,排查問題過程中通過現象會優先考慮并發的問題,然而真相卻恰恰相反,參見下圖時序:

循環依賴產生的原因

數據過度冗余

數據冗余是導致服務之間循環依賴的主要原因,為了保證多個服務之間數據的一致性,某個服務對數據的修改要同步到其他服務,保證其他服務冗余字段的信息準確。

上面訂單上冗余客戶姓名的場景就是個很好的例子,冗余數據在一定程度上增強了業務實現的簡便性,但為了保證數據一致性,也增加了服務間不必要的調用。

缺失業務概念

和數據過度冗余相對的是在軟件設計時缺少必要的業務概念,也同樣會導致循環依賴的情況發生;典型的場景是上游系統的數據狀態需要下游系統的數據進行計算得到,當需要對上游系統的數據狀態時,上游服務會調用下游服務的接口來進行計算。

這種場景也很常見,繼續用訂單和客戶的例子幫助理解:

如果一個客戶的所有訂單要么取消,要么已經完成開票結算流程,那么這個客戶就是一個成功客戶,否則是一個服務中客戶。

在軟件設計時如果沒有給客戶定義一個狀態來表達這個業務概念,那么每次需要拿到客戶狀態時只能通過訂單服務來進行查詢計算。

濫用同步調用

上面兩種場景一旦產生循環依賴,往往也伴隨著同步調用的濫用,然而也有一些場景既沒有數據過度冗余,也沒有缺少業務概念,但仍然可能會濫用同步調用。

上文圖中用戶離職更新客戶所有者信息的場景就是一個很好的例子,雖然使用同步調用的方式從實現結果上來看是非常直接有效的方法,但長遠來看,這種無腦的濫用同步調用讓系統的復雜度變的非常高,當我們希望替換或重構某個服務,我們很難依據業務分析清楚到底有哪些服務會受到影響。

消滅循環依賴的方法

通過上面對循環依賴原因的分析(這里我們不考慮微服務劃分不合理的場景),可以看出循環依賴通常是為了滿足某種業務需求,在服務之間增加了不合理的調用。

要解決循環依賴,必須要在微服務之間建立一些原則來約束微服務之間的通信,定期通過這些原則來審視我們的系統,找到問題并進行重構,這些原則應該包括:

  • 定義服務上下游關系,下游服務可以直接依賴上游服務,反之則不可
  • 上游服務的變更對下游服務產生影響需要通過領域事件(異步)的方式來實現
  • 服務之間要通過數據Id(或類Id,能夠唯一代表數據且不變的屬性)來進行關聯,盡量不做過多的數據冗余
  • 一旦需要上游服務調用下游服務才能完成業務時,要考慮是否上游服務缺少業務概念
  • 為滿足前端邏輯而導致的服務間交互邏輯要放到BFF(Backend for frontend)中,而不是增加服務間的調用

小結

微服務架構提倡把服務拆的小而獨立,一個軟件系統往往會有很多服務,大部分業務需求是需要多個服務一起配合才能完成;受限于交付壓力,在對架構的理解不是很透徹的情況下,開發人員往往傾向于采用更容易的(熵增)方式實現功能,在這種情況下,循環依賴是一個非常容易發生的壞味道,對系統的健康具有巨大危害。

我們可以通過一些技術手段來發現系統中的循環依賴問題,比如通過鏈路追蹤系統(如Zipkin)將服務間依賴關系可視化出來;也可以在發現問題時將有問題的流程時序圖畫出來,可視化的方式可以很容易幫我們找到系統中循環依賴的問題,然后我們就可以對癥下藥,消滅壞味道。

責任編輯:趙寧寧 來源: Thoughtworks洞見
相關推薦

2019-10-11 09:07:46

Java代碼對象

2020-06-12 08:21:58

JavaScript代碼開發

2024-07-12 08:52:50

2023-01-11 08:41:47

微服務循環依賴

2021-05-26 11:50:37

代碼優化Java

2015-07-29 13:22:40

.NET代碼

2012-07-13 09:38:15

項目代碼

2012-07-13 09:35:58

PHP

2012-07-19 10:42:17

項目

2018-08-24 21:25:02

編程語言代碼重構GitHub

2024-07-02 10:58:53

2021-07-13 10:00:00

微服務SleuthElasticSear

2019-09-09 06:30:06

Springboot程序員開發

2018-08-01 14:20:11

微服務架構人工智能

2019-07-11 15:25:02

架構運維技術

2022-06-17 12:05:25

微服務注冊

2017-07-04 17:35:46

微服務架構Spring Clou

2021-03-09 09:33:42

網關授權微服務

2024-08-05 10:03:53

2023-10-30 00:11:48

微服務負載均衡場景
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线不卡 | 黄色免费在线观看网址 | 天天av网 | 欧美一区成人 | 中文字幕一区二区三区四区五区 | 亚洲欧美综合 | 91国在线观看 | 久久人| 亚洲国产精选 | caoporn国产 | 国产精品国产精品国产专区不片 | 亚洲午夜av久久乱码 | 欧美色性 | 91在线免费视频 | 亚洲精品一区中文字幕乱码 | 日韩一级 | 成人免费视频网站在线看 | 免费一二区 | 亚洲国产成人精品久久久国产成人一区 | 国产精品一区二区无线 | 中文字幕一区二区不卡 | 激情av网站 | 亚洲国产精品久久久 | 国产一区二区中文字幕 | 欧美黄色网络 | 最新中文字幕在线 | 日韩成人在线观看 | 一级视频在线免费观看 | 亚洲三区在线观看 | 国产亚洲一区二区三区 | 国产精品成人一区二区三区夜夜夜 | 国产精品亚洲成在人线 | 黄视频免费观看 | 日韩欧美中文字幕在线视频 | 国产999精品久久久久久 | 精品国产一区久久 | 日韩精品一区二区三区四区视频 | 一级在线视频 | 在线视频一区二区 | 欧美成人一区二区三区 | 国产一级大片 |