小小的公共庫,大大的耦合,你痛過嗎?

2022-05-05 11:09:12 字數 1650 閱讀 6176

什麼是耦合?

耦合,是架構中,本來不相干的**、模組、服務、系統因為某些原因聯絡在一起,各自獨立性差,影響則相互影響,變動則相互變動的一種架構狀態。

感官上,怎麼發現系統中的耦合?

作為技術人,每每在心中罵上下游,罵兄弟部門,「這個東西跟我有什麼關係?為什麼需要我來配合做這個事情?」。明明不應該聯動,卻要被動受影響,就可能有潛在的耦合。

因為公共庫,導致相互受影響,就是乙個耦合的典型案例。

場景還原

乙個看似「公共」的業務庫(*.so *.jar *.dll *.php),很多業務系統都依賴於這個公共庫,這個庫使得這些系統都耦合在了一起。

耦合如何導致相互影響?

業務1,業務2,業務3都依賴於某乙個biz.jar,業務1因為某個需求需要公升級biz.jar。上線前,業務1的qa進行了大量的測試,確保無誤後,**發布,發布完線上驗證無誤後,上線完成,閃人。

突然,bug群裡有人反饋,業務2的系統掛了,業務3的系統也掛了,一下炸開了鍋:

業務2的大boss首先發飆:「技術都幹啥了,怎麼系統掛了」

業務2的rd一臉無辜:「業務1上線了,所以我們掛了」

額,然而,這個理由,好像在大boss那解釋不通…

業務2的大boss:「業務1上線?業務1上線前測試了麼」

業務1的qa自信滿滿:「測試了呀,上線前上線後都驗證了,沒問題呀」

業務2的大boss對業務2的rd吼道「還想甩鍋,拖出去祭天」

不知道大家工作中會不會遇到這樣的場景,因為公共庫的耦合,兄弟部門上線,影響的確是你,此時你心裡可能就在罵娘了,這幫不靠譜的**隊友。

特別的,如果公共庫的使用方很廣,這個耦合很嚴重,可能影響很大的範圍。

如何解除公共庫耦合?

方案一:**拷貝乙份

別嘲笑這個方案,誰敢說自己寫**的時候沒這麼幹過?

我們都知道這不是乙個好的方案,但不可否認,拷貝之後,**各自演化,乙個地方公升級出錯,只影響一方,拷貝方只要不動原有**,至少是不會受影響的。

**拷貝缺點很多,系統拆分時,萬不得已不要使用這個方案。

方案二:垂直拆分,將公共庫里業務個性化的**拆到呼叫方去,不要放在公共庫里

需要把業務個性的**拆分到各個業務線自己的工程,自己的業務庫里去,例如s1.jar / s2.jar / s3.jar,修改各自的**,至少不會擴大影響範圍。

大家為什麼都把**往乙個公共庫里塞?

很多時候,因為惰性,一點一點的惰性,日積月累,終成大坑。

這個垂直拆分是乙個架構重構的過程,需要各業務方配合。

方案三:服務化,將公共庫里通用業務**拆到下層去

完成了第一步,業務個性化的**提取到業務側上游。

接下來是第二步,業務通用的**,下沉抽取一層服務,服務對上游提供rpc介面:

每次修改底層介面,需要測試介面的相容性,保證不影響舊呼叫方

如果是新的業務,則建議新增介面

最終,達到通過服務rpc呼叫的方式來解除耦合。

有朋友會問:

底層服務介面的測試

上游業務層對公共庫的測試

都是測試,為何前者能控制影響範圍呢?

底層介面,所有人呼叫,介面沒問題則呼叫方都沒問題

上游業務層對公共庫測試,只能保證自己的業務沒有問題,並不能保證其他業務方沒有問題

個性業務**上浮,共性業務**服務化下沉,只是乙個很小的優化點,但對於公共庫解耦卻是非常的有效。

小小的IP,大大的耦合,你痛過嗎?

什麼是耦合?耦合,是架構中,本來不相干的 模組 服務 系統因為某些原因聯絡在一起,各自獨立性差,影響則相互影響,變動則相互變動的一種架構狀態。感官上,怎麼發現系統中的耦合?作為技術人,每每在心中罵上下游,罵兄弟部門,這個東西跟我有什麼關係?為什麼需要我來配合做這個事情?明明不應該聯動,卻要被動配合,...

三正規化的依賴,小小的知識,大大的學問

三正規化使得資料庫的設計變得有據可依,資料庫的冗餘大大減少。然而,三正規化的定義,卻不那麼讓人省心,一堆文字外加數學知識,讓人著實有點小蒙。雖然說完全按照三正規化設計資料庫並不可取,但是要想設計乙個好的資料庫,三正規化的知識是必不可少的。要想更好理解三正規化的定義,那麼了解依賴是必不可少的,了解了這...

寫MFC遇到的各種大大小小的坑

搭建環境 vs2013 mfc120生成器 python3.6 這是乙個記錄了遇到的大大小小的坑,真的是十個裡面九個是坑!這裡是用來記錄我遇到的坑的,當然裡面還有許多未解之謎,我自己也不明白 有cmd命令列註冊,有直接regsvr32 c windows system32 syswow64 msco...