服務拆分
拆分粒度不應該過分追求細粒度,要考慮適中不能過大或過小。按照單一職責原則和康威定律,在業務域、團隊還有技術上平衡粒度。拆分後的程式碼應該是易控制,易維護的,業務職責也是明確單一的。 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的版本相容性。不能夠單純以程式碼量來對服務拆分的成果進行評估。