Stefan Tilkov在microXchg柏林的演講:微服務的模式與反模式

在柏林舉行的microXchg 2018上,Stefan Tilkov在演講中以他的視角探討了微服務項目的一系列模式與反模式。他特別強調,有些他認為是好模式的內容,其他人可能認為是反模式,反之亦然。

Stefan Tilkov在microXchg柏林的演講:微服務的模式與反模式

這個演講首先討論了微服務是一種設計模塊的模式,在這種模式中我們將模塊設計為單獨的部署和運維單元,這些模塊的實現有著非常高的自由度。模塊基於網絡進行通信,會在它們之間建立一個邊界,這樣的話會促進封裝,在交互和協作的時候,更加難以違背模塊的設計初衷。

Tilkov是INNOQ的聯合創始人,對他來說,採用微服務的影響包括隔離性、自治以及靈活性,他也提到按照他的定義構建模塊化的軟件時,其實沒有必要完全採用微服務的方式。但是,鑑於我們經常不能有效地設計大規模的軟件,所以我們依然需要微服務模式。

演化性的架構

在構建系統的時候,我們不一定從一開始就能創建出合適的架構,你可以創建“演化性的架構(Evolutionary Architecture)”,它的構造具有適應性,能夠在特定的時間點轉換為合適的架構。對於Tilkov來說,這種架構的實現方式包括:

  • 將大型的域分割為他所稱的“變更孤島”

  • 針對可替代性進行設計,而不是可重用性

  • 最小化共享依賴,重點關注自治和冗餘,而不是重用

這種架構的一個優勢就是能夠幫助我們實現實驗性的特性,比如使用A/B測試。

分佈式單體應用

Tilkov提到的第一個反模式是分佈式單體應用(Distributed Monolith),或者稱之為變壞的微服務,他將其描述為:

系統是由規模隨意、緊密耦合的模塊所組成的,這些模塊之間通過網絡接口進行通信。

Tilkov認為,這通常是跟風或會議驅動所形成的架構,對業務領域缺少關注。使用這種模式帶來的常見後果包括:

  • 變更所帶來的連鎖反應

  • 複雜的環境

  • 難以理解和維護

在極端負面的情況下,這可能會變成無人能夠管理的技術和框架所組成的混合體。

幻想解耦

在Tilkov的經驗中,團隊引入微服務通常是為了更加靈活並且能夠快速適應變化。“幻想解耦(Decoupling Illusion)”是一個反模式,在這種模式下我們會將系統拆分為模塊,但是因為缺少領域相關的知識,所以並沒有解決基礎的問題,這樣會背離利益相關者和業務需求。我們已經創建的模塊會從兩個或更多的利益相關者那裡獲取需求,它們還會依賴於其他的模塊。這樣的話,這些模塊必須要一起演化和部署。

微平臺

與前面對應的另外一個反模式叫做“微平臺(Micro Platform)”,在這種反模式下,會將所有的內部/運維服務標準化到一個框架之中,並強制所有的團隊採用。現在,我們可能面臨的問題就是每個服務中都會有一個技術性的依賴,所有的服務都會對某個利益相關者產生依賴。這種反模式的主要推動力來自標準化的目標,有時候這種目標看起來是很有道理的,尤其是在項目的初期,但是這也會帶來一些需求,也就是協調新的特性以及跨所有的團隊進行更新。為了緩解這種狀況,Tilkov建議框架的使用是可選的。

實體服務

“實體服務(Entity Service)”,舉例來說,某個訂單(order)服務,在零售領域這可能是一個看上去很合理和有用的服務。這種反模式的問題在於對該服務感興趣的所有其他的服務都會對該服務提出需求,因此最終的結果就會導致實體服務變成了所有客戶端需求的混合體。Tilkov認為這種實體服務有時候根本不需要,它們的責任應該由其他的服務來完成,這些服務對訂單有著自己的視角。他認為,創建該實體服務的唯一原因就是它的名字中包含了“訂單”這個詞,在你嘗試創建訂單通用定義的地方,推薦參考企業數據模型(enterprise data model,EDM)。

DDDD與SCS

Tilkov經常見到一些客戶,他們具有非常複雜的應用,這些應用由不同的部分所組成,即界限上下文(bounded context)。當這些上下文與微服務結合的時候,最終形成的就是“分佈式領域驅動設計(Distributed Domain-Driven Design,DDDD)”模式,在這種模式中,通信通常是異步的,還可能會使用業務事件,數據是冗餘存儲的。這些服務是松耦合的,如果每個服務的大小符合界限上下文的話,它們也會更加自治。對Tilkov來說,採用這種方式的主要驅動力在於能夠實現單獨的演化。

自包含系統(Self-Contained System,SCS)類似於DDDD模式,區別在於每個服務還包含了自己的UI組件,與服務的輕量級集成通常是在前端完成的。這樣的話,能夠最小化所需的基礎設施,對Tilkov來說,這種模式最適合解耦開發團隊。

單體應用

Tilkov提到的最後一個模式是“單體應用(Monolith)”,他相信這種模式依然適用於很多場景,例如單個小型的團隊。這是一個標準的應用,開發起來非常簡單直接、易於重構並且不包含任何人為引入的分佈性:

高度內聚、緊密集成、單一部署的應用。

總結

Tilkov在演講中,主要關注了服務的大小以及正確進行規模劃分所面臨的挑戰。他相信如果一個架構有2000個事項組成的話,那麼它將會非常難以理解。因此,他主張藉助分組或集群的方式,為系統構建更多的結構。他總結到,沒有哪個模式是最適合的模型,它們都依賴於具體的上下文。我們選擇的解決方案要始終是由領域和所需的業務收益所驅動的。他還指出,如果可能的話,你應該爭取採用一種可演化的架構,它能夠隨著需求而增長。

會議演講的視頻已經進行了錄製,其中有一部分已經發布,更多的視頻稍後會發布。

查看英文原文:Stefan Tilkov at microXchg Berlin: Microservice Patterns and Antipatterns


分享到:


相關文章: