經過「庫」來實現業務,可能會引起業務系統之間耦合,須要通用業務服務化,將通用業務下沉,詳見《小小的公共庫,大大的耦合,你痛過嗎》。數據庫
經過「join」來實現業務,可能會致使數據庫之間耦合,須要基礎數據服務化,實現數據庫私有化,解除數據庫之間的耦合,詳見《小小的數據庫,大大的耦合,你經過嗎》。markdown
場景還原
業務1,業務2,業務3,由於join致使數據庫實例耦合在了一塊兒。架構
爲了實現通用數據庫table-user的解耦,實施了服務化,將通用user數據的訪問抽象出了服務。ide
因爲服務化不合理,會有不多不多的個性化業務邏輯,實如今底層的服務中,典型的僞代碼是:優化
switch(biz_type){ case(1) : exec_logic1(); case(2) : exec_logic2(); case(3) : exec_logic3(); default : exec_default(); }
不妨設,業務1來了一個新的個性化需求,這個需求原本實如今業務1本身的代碼裏是合理的,但工程師S想到,底層的通用服務裏也有業務1的一小撮個性化代碼,評估後,發現實如今底層新的需求改動的代碼最小,時間最短,因而來找底層服務的負責人工程師B。設計
遺留了不合理的代碼,就會有第一次妥協,妥協了業務1,就會妥協業務2,隨着時間的推移,底層服務愈來愈複雜:code
直到有一天,底層服務出了一個小bug,影響了業務1,業務2,業務3,歷史老是驚人的類似:blog
業務代碼上浮,通用代碼下沉,服務化完全。
解決方案並不複雜,分層架構中,每一層都有本身的職責,每一層都應該守住本身的底線。it
啓示
1、討論技術方案時,不要總以:
「放在你那邊作代碼少」
「放在你那邊作時間短」
做爲設計折衷的理由,而要多問:
「怎麼作合理」table
2、儘可能杜絕底層出現switch case(biz_type)走不一樣分支的代碼。
業務代碼上浮,通用代碼下沉,服務化完全,只是一個很小的優化點,但對於底層服務解耦倒是很是的有效。
但願你們天天收穫一點點,這樣架構就能美好一點點。
你痛過嗎,你被反問過「你實現代價小,你來搞」嗎?你被迫實現過「switch case」嗎?那幫轉下。
相關文章:小小的數據庫,大大的耦合,你痛過嗎?小小的IP,大大的耦合,你痛過嗎?小小的公共庫,大大的耦合,你痛過嗎?