Categories
程式開發

為什麼每個微服務要有自己獨立的數據庫?


實施微服務架構,我們一直在遵循一個實踐原則:每個微服務要有自己獨立的數據庫,避免數據庫層面的耦合。 這種理所當然感覺好像不需要多加思考,就是應該這樣做;

為什麼每個微服務要有自己獨立的數據庫? 1

圖片來源:James Lewis和Martin Fowler的文章《微服務“》

那麼到底為什麼每個微服務都需要獨立的數據庫,數據放在一個數據庫有問題嗎? 要回答這個問題,我們還是要回歸到微服務的定義(參見James Lewis和Martin Fowler的文章《微服務“》):

簡而言之,微服務架構風格是一種將單個應用程序開發為一組小服務的方法,每個小服務都在自己的進程中運行並與輕量級機制(通常是HTTP資源API)進行通信。 這些服務圍繞業務功能構建,並且可以由全自動部署機制獨立部署。 這些服務的集中管理幾乎沒有,它可以用不同的編程語言編寫並使用不同的數據存儲技術。

這個定義中指明了微服務架構風格的典型特徵,如:技術異構(每個服務可以採用不同的編程語言或不同的數據存儲技術)、獨立部署和圍繞業務能力構建,等等。

為了回答為什麼每個微服務要有自己獨立的數據庫這個問題,我們可以從微服務架構風格的幾個典型特徵入手,看看獨立數據庫可以帶來哪些好處,或者共享數據庫會帶來哪些問題。

微服務支持技術異構

為了更好的解決特殊場景的問題,微服務架構並不提倡使用適合所有場景的標準化技術,而是針對每個服務的特點,選擇更合適的技術。

這個技術不僅包括編程語言、技術框架,當然也包括數據存儲技術;紐曼(Sam Newman)在《微服務設計》一書中舉了一個例子很好的解釋了數據存儲技術異構帶來的好處:

對於社交網絡來說,圖數據庫能夠更好的處理用戶之間的交互操作,但對於用戶發布的帖子而言,文檔數據庫可能是一個更好的選擇。

為什麼每個微服務要有自己獨立的數據庫? 2

圖片來源:《微服務設計》第1章

技術異構很自然讓我們為每個微服務選擇了獨立的數據庫,但槓精附體的同學可能緊接著會問:那如果服務不需要採用異構的技術,那是不是就可以使用同一個數據庫了呢,比如都使用MySQL數據庫?

微服務是自治的

微服務是小而自治的,自治性的一個非常重要的特性就是獨立部署,一個服務的修改和部署不應該對其他服務產生影響,但如果多個服務共享數據庫,在數據庫層的耦合讓不確定性變大,一個服務對數據庫結構的變更很有可能影響其他服務,即破壞了自治性。

自治性的好處體現在整個系統的彈性上,當一個服務發生故障時,不會造成整個系統的不可用。 然而,如果多個服務共享數據庫,數據庫的異常會導致多個服務同時故障,也就大大增加了整個系統不可用的概率。

自治性還體現在服務的可擴展性上,不同的服務因業務不同其需要滿足的性能和並發量要求也不同。 當請求量增加時只需要對部分服務進行擴展,而不是所有服務;同樣當數據庫性能無法滿足需求時,只需要對部分服務的數據庫進行擴容升級,而如果多個服務共享數據庫,擴容升級的影響就會作用到多個服務,一方面破壞了服務的自治性,另一方面當其他服務對數據庫沒有那麼高要求時,資源是浪費的。

繼續槓精附體,那是不是可以把並發量和性能要求相近的業務合併為一個服務,而共享同一個數據庫呢?

微服務是圍繞業務能力構建的

這個問題其實是微服務架構實施落地的一個非常熱點問題:如何劃分微服務?

劃分微服務要遵循高內聚、低耦合這個原則的,這也是微服務架構優勢所在;《領域驅動設計》引入了限界上下文(bounded context)的概念,通過對業務的梳理找到不同業務上下文之間的邊界,幫助我們找到了劃分微服務的方法,這裡的重點在業務邊界。 James Lewis和Martin Fowler在微服務的定義中也強調微服務是構建在業務能力之上的,可見微服務的小而自治是建立在獨立的業務能力基礎之上的。

因此,簡單的將並發量和性能要求相近的業務合併到一個服務中,無法達到微服務期望的效果,也就沒法獲得微服務所具有的好處。 不同的業務對數據庫的要求除了要考慮並發量和性能,還應該包括數據量的大小、讀寫的比例、實時性要求等等,共享數據庫的方式一般情況下也很難滿足不同業務服務對這些指標的要求,將所有服務的數據都存放在一個數據庫中本身也是一種非常大的挑戰。

微服務架構要不斷演進

為什麼每個微服務要有自己獨立的數據庫? 3

微服務架構風格還有一個非常重要的特徵,就是支持架構的演進;不論是互聯網企業,還是在數字化轉型過程中的傳統企業,市場的變化和不確定性是不可避免的,當接到一個新的需求,需要用新的技術手段來解決,微服務架構就體現出了獨特的優勢,在不對其他服務產生影響的情況下,可以隨意變更一個服務內部的技術框架或數據存儲技術,共享數據庫明顯做不到這一點。

最後

以上通過分析微服務架構風格的典型特徵,我們嘗試回答了為什麼每個微服務要有一個獨立數據庫,每個服務擁有獨立數據庫和其他微服務架構提倡的實踐一起,共同完成了微服務架構風格所具備的優點。

每個服務擁有獨立數據庫並不是只有優點,數據的分散管理給數據一致性帶來了很大的挑戰,考慮到分佈式事務的高昂代價和實現成本,微服務提倡服務之間的無事務協調,通過最終一致性來保證業務流程的正常推進。