­

一起玩轉微服務(8)——服務拆分原則

服務拆分

拆分粒度不應該過分追求細粒度,要考慮適中不能過大或過小。按照單一職責原則和康威定律,在業務域、團隊還有技術上平衡粒度。拆分後的程式碼應該是易控制,易維護的,業務職責也是明確單一的。 AKF擴展立方體,是一個叫AKF的公司的技術專家抽象總結的應用擴展的三個維度。理論上按照這三個擴展模式,可以將一個單體系統,進行無限擴展。AKF擴展立方如圖所示。

 

•X 軸 :水平複製,即在負載均衡伺服器後增加多個web伺服器。•Y 軸 :功能分解,將不同職能的模組分成不同的服務。從y軸這個方向擴展,才能將巨型應用分解為一組不同的服務,例如訂單管理中心、商品資訊管理中心、庫存管理中心等等。•Z 軸 :對資料庫的擴展,即分庫分表(分庫是將關係緊密的表放在一台資料庫伺服器上,分表是因為一張表的數據太多,需要將一張表的數據通過hash放在不同的資料庫伺服器上)。

三個維度的擴展對比如表所示:

AKF

業界對於可擴展的系統架構設計有一個樸素的理念,就是: 通過加機器(水平擴展)就可以解決容量和可用性問題 。( 如果一台不行那就兩台) 。

段子:( 世界上沒有什麼事是一頓燒烤不能解決的。如果有,那就兩頓 。)

 

這一理念在「雲計算」概念瘋狂流行的今天,得到了廣泛的認可!對於一個規模迅速增長的系統而言,容量和性能問題當然是首當其衝的。但是隨著時間的向前,系統規模的增長,除了面對性能與容量的問題外,還需要面對功能與模組數量上的增長帶來的系統複雜性問題以及業務的變化帶來的提供差異化服務問題。而許多系統,在架構設計時並未充分考慮到這些問題,導致系統的重構成為常態,從而影響業務交付能力,還浪費人力財力!對此,《可擴展的藝術》一書提出了一 個更加系統的可擴展模型—— AKF 可擴展立方(Scalability Cube)。這個立方體中沿著三個坐標軸設置分別為:X、Y、Z。

下面看一下AKF的拆分實踐:

拆分應用

•X軸:從單體系統或服務,水平克隆出許多系統,通過負載均衡平均分配請求。•Y軸 :面向服務分割,基於功能或者服務分割,例如電商網站可以將登陸、搜索、下單等服務進行Y軸的拆分,每一組服務再進行X軸的擴展。•Z軸 :面向查找分割,基於用戶、請求或者數據分割,例如可以將不同產品的SKU分到不同的搜索服務,可以將用戶哈希到不同的服務等。

拆分資料庫

•X軸:從單庫,水平克隆為多個庫上讀,一個庫寫,通過資料庫的自我複製實現,要允許一定的讀寫時延。•Y軸 :根據不同的資訊類型,分割為不同的資料庫,即分庫,例如產品庫,用戶庫等。•Z軸 :按照一定演算法,進行分片,例如將搜索按照MapReduce的原理進行分片,把SKU的數據按照不同的哈希值進行分片存儲,每個分片再進行X軸冗餘。

總結

要做好微服務的分層:梳理和抽取核心應用、公共應用,作為獨立的服務下沉到核心和公共能力層,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。 對於服務的拆分,要使用迭代演進的方式,不能一次性完成所有的服務的拆分,需要確保團隊可接受,粒度適中,同時需要優先考慮API的版本兼容性。不能夠單純以程式碼量來對服務拆分的成果進行評估。