北京2020年12月19日 /美通社/ -- 2020年12月19日,第四屆領域驅(qū)動設計峰會(DDD Conference)再度開啟。不同于往屆的線下舉行形式,本屆峰會采取線上的形式,致力于打造一場架構(gòu)設計和技術實踐的盛宴。作為軟件架構(gòu)設計新的潮流,領域驅(qū)動設計(Domain Driven Design,簡稱DDD)強調(diào)業(yè)務和技術的統(tǒng)一性,為復雜領域軟件工程的設計決策提供實踐框架,幫助企業(yè)不斷拓展數(shù)字化業(yè)務。
2020年,一場突如其來的全球公共衛(wèi)生事件對于人們的生活與工作產(chǎn)生了巨大的影響,各行各業(yè)積極應對挑戰(zhàn)。業(yè)務的劇變對架構(gòu)平臺帶來了巨大的沖擊,如何客觀地評估分析架構(gòu)現(xiàn)狀、該從哪些維度設定架構(gòu)演進的目標,又如何引導架構(gòu)增量地向目標演進,成為當下企業(yè)持續(xù)探索的命題之一。
領域驅(qū)動設計峰會(DDD Conference)是由國內(nèi)領域驅(qū)動設計(DDD)思想和實踐的領軍者——ThoughtWorks的架構(gòu)咨詢師們組織發(fā)起,希望為國內(nèi)的領域驅(qū)動設計(DDD) 實踐者們提供一個互相交流、分享自己團隊的成功經(jīng)驗的平臺,使得領域驅(qū)動設計(DDD)的架構(gòu)思想能夠在國內(nèi)被更多人所認知,從而形成更大的規(guī)模效應。
六大主題分享全景呈現(xiàn)DDD新常態(tài)
本屆峰會邀請了ThoughtWorks全球技術總監(jiān)及軟件架構(gòu)師Neal Ford、Unisys首席應用架構(gòu)師與全球DDD社區(qū)領袖Indu Alagarsamy等來自海外的領域驅(qū)動設計(DDD)的領軍人物分享在架構(gòu)設計領域出現(xiàn)的新的嘗試和探索。
同時,民航信息技術總監(jiān)張逸、IBM資深應用架構(gòu)師于靜、《中臺架構(gòu)與實現(xiàn):基于DDD和微服務》作者歐創(chuàng)新等國內(nèi)持續(xù)實踐領域驅(qū)動設計(DDD)的代表和思想領袖也分享了他們在各個不同場景下對于使用領域驅(qū)動設計的感悟和總結(jié),展現(xiàn)了在后疫情時代領域驅(qū)動設計將會出現(xiàn)的新變化。
不論是演講嘉賓還是話題設置,本次峰會既呈現(xiàn)了DDD的現(xiàn)狀與未來趨勢,又展示了DDD的最佳行業(yè)實踐,全方位呈現(xiàn)了DDD的發(fā)展情況。
構(gòu)建演進式架構(gòu)
在過去十年中,DDD的限界上下文概念影響了軟件架構(gòu),并啟發(fā)Neal Ford產(chǎn)生了《演進式架構(gòu)》書中的一些思想。作為ThoughtWorks全球技術總監(jiān)及軟件架構(gòu)師,Neal Ford是國際公認的軟件開發(fā)和交付方面的專家,尤其是在敏捷工程技術和軟件體系結(jié)構(gòu)的交集方面,以及DDD如何啟發(fā)他產(chǎn)生了軟件架構(gòu)的量子概念。
業(yè)務實踐在變,工具和框架在演進,創(chuàng)新的工具和技術不斷涌現(xiàn),這讓軟件開發(fā)生態(tài)體系也是瞬息萬變。在過去的幾年里,軟件開發(fā)核心工程實踐的漸進發(fā)展,讓開發(fā)者重新思考架構(gòu)是如何隨著時間的推移而變化的,以及重要的架構(gòu)特征如何能夠在架構(gòu)演進過程中得到有效保護,這促使Neal Ford與ThoughtWorks全球CTO Rebecca Parson博士一起總結(jié)提煉了演進式架構(gòu)的核心概念。
在峰會的主題分享上,Neal Ford討論了有關可演進架構(gòu)的兩個關鍵洞察。Neal Ford指出,演進式架構(gòu)是在當需求出現(xiàn)的時候通過適應函數(shù)來把握架構(gòu)演進的方向,演進式架構(gòu)隨著系統(tǒng)和業(yè)務的增加而變化,而且能夠保證用戶得到想要的部分,追求性能上的優(yōu)化,追求擴展性的不斷提升。
演進式架構(gòu)支持跨多個維度的引導性增量更改。演進架構(gòu)從進化計算世界借鑒了適應度函數(shù)的概念,以定義所謂的架構(gòu)適應性功能。這是對某些架構(gòu)特性或架構(gòu)特性組合提供客觀完整性評估的一種機制,描述了一系列可用于驗證體系結(jié)構(gòu)適用性的工具。
Neal Ford表示,原子適應度功能是僅關注單個特征和體系結(jié)構(gòu)的功能,而整體適應性功能則關注特征的組合,很多時候體系結(jié)構(gòu)特征相互糾纏。一旦定義了這些架構(gòu)適應性功能,企業(yè)需要持續(xù)集成、部署管道以及諸如此類的敏捷調(diào)整實踐的領域。
演進式架構(gòu)最初目的是研究適應度函數(shù)的可演進性,在此過程中,我們希望能夠衡量特定架構(gòu)風格的演進程度,雖然產(chǎn)生了許多代碼級量度,但是這還不夠。受到DDD的啟發(fā),Neal Ford提出了軟件架構(gòu)的量子概念。
架構(gòu)量子是一種以軟件架構(gòu)表示的領域驅(qū)動設計中的有限上下文的想法。架構(gòu)量子具有高功能凝聚力和同步通信的獨立可部署組件。架構(gòu)量子關注事物如何耦合在一起,不僅分析了架構(gòu),而且還分析了操作級別,并包含了數(shù)據(jù)庫和用戶界面等內(nèi)容。
“架構(gòu)量子對有限上下文的定義會有所不同,因為我們正試圖衡量事物在生態(tài)系統(tǒng)中的耦合程度。我們確實想要一個有界上下文的概念,但要用架構(gòu)術語來表達。我們希望它作為一個有用的架構(gòu)分析工具?!盢eal Ford說。
領域驅(qū)動設計和消息傳遞的融合
DDD不僅可以幫助企業(yè)敏捷地編寫高質(zhì)量的代碼,還能使所編寫的軟件能靈活應對業(yè)務變化。當使用消息傳遞技術在清晰整潔和定義良好的限界上下文之間進行通信時,就可以消除時序上的耦合,結(jié)合DDD就能構(gòu)建可以自治的微服務。
Unisys首席應用架構(gòu)師、全球DDD社區(qū)領袖Indu Alagarsamy在分享中認為,DDD與作為軟件技術的消息傳遞進行融合,也就是實現(xiàn)領域驅(qū)動設計與事件驅(qū)動架構(gòu)相結(jié)合,構(gòu)建可以隨著業(yè)務變化而擴展的可靠系統(tǒng)。
Indu Alagarsamy還以電商場景進行了詳細說明,銷售、庫存、運輸?shù)炔煌块T的員工使用的領域語言不同,領域驅(qū)動設計引入了限界上下文的概念。我們可以根據(jù)團隊或部門拆分模型,進行上下文的劃分和設計。這時上下文之間需要能夠以一種自主且可靠的方式進行通信,這是事件驅(qū)動架構(gòu)很好地與領域驅(qū)動設計結(jié)合的地方。
命令和事件都是消息,但是通過明確區(qū)分什么是命令、什么是事件,可以幫助我們更好地設計軟件。然而如何設計一個具有事件、消息和命令的系統(tǒng)呢?這就需要引入事件風暴。事件風暴是一種了解業(yè)務流程的協(xié)作可視化方式,在討論流程中的業(yè)務行為時,使用事件風暴,程序員和架構(gòu)師能夠找出信息流。
“我們要做的是編寫符合業(yè)務需求的正確軟件,了解重要的業(yè)務行為有助于編寫正確的代碼,并使軟件與業(yè)務保持一致,事件和消息驅(qū)動架構(gòu)可以幫助我們擺脫時間耦合,使軟件組件具有自主性。隨著對領域相關信息的了解越來越多,你可以不斷的改進模型,使其變的更好。如果你想使模型中的上下文自治,可以使用事件在這些不同的限界上下文之間進行通信?!盜ndu Alagarsamy說。
同時,Indu Alagarsamy認為,微服務的本質(zhì)在于服務需要自治,并可以根據(jù)數(shù)據(jù)做出決定,不需要不停地詢問其他上下文。因此,事件作為在相同的限界上下文中進行通信的機制,變得非常重要。
領域驅(qū)動設計大揭秘
作為《解構(gòu)領域驅(qū)動設計》作者,同時也是民航信息技術總監(jiān),張逸對于DDD有著自己的獨特看法,比如數(shù)據(jù)驅(qū)動與領域驅(qū)動、領域驅(qū)動設計下的單體架構(gòu)等。
張逸在主題分享中表示,數(shù)據(jù)驅(qū)動進入架構(gòu)設計領域造成模型沒有上下文的邊界,而DDD引入了限界上下文,通過業(yè)務能力完成重用,進而確定領域模型的知識語境,讓架構(gòu)順應業(yè)務的變化方向。
DDD的特點與價值在于它定義的模式,限界上下文與聚合是DDD的核心模式。限界上下文是架構(gòu)層次的自治單元,是業(yè)務能力的重用而非模型的重用。而微服務的協(xié)作就是限界上下文的協(xié)作,領域驅(qū)動設計成為顯學,進入黃金時代。
單體架構(gòu)(Monolithic Architecture)是一種將所有功能打包在一個容器中運行的設計風格,一個實例中集成了一個系統(tǒng)的所有功能。從中大型項目的業(yè)務形態(tài)、復雜度及響應速度等維度看單體架構(gòu)時可以發(fā)現(xiàn)它存在擴展性差、無法實現(xiàn)復雜業(yè)務、技術升級困難、開發(fā)效率低等問題。
張逸表示,常見的區(qū)分單體架構(gòu)和微服務架構(gòu)的做法并不正確,雖然沒有限界上下文的單體架構(gòu)可能導致“大泥球”,但是單體架構(gòu)也要通過業(yè)務能力進行縱向切分。如果單體架構(gòu)通過限界上下文進行邊界控制,其實可以降低微服務架構(gòu)風格的演化成本,也能規(guī)避過度微服務化帶來的技術風險。
另外,張逸認為,領域驅(qū)動設計存在四大“天生不足”,比如領域驅(qū)動設計缺乏一個規(guī)范的過程指導,使得其缺乏可操作性;領域驅(qū)動設計沒有匹配的需求管理體系等,為此,我們需要領域驅(qū)動設計統(tǒng)一過程,確保DDD的落地實施。
領域驅(qū)動設計在大型遺留系統(tǒng)改造中的實踐
自領域驅(qū)動設計和微服務概念提出至今,越來越多的互聯(lián)網(wǎng)巨頭以及傳統(tǒng)行業(yè)都開始對自己的遺留系統(tǒng)進行微服務改造,通過把系統(tǒng)拆分為更加靈活、有業(yè)務邊界上下文、松耦合的服務來應對快速變化的市場。
IBM資深應用架構(gòu)師于靜在主題演講中介紹了一個有著二十年歷史并支撐百萬交易額的電商平臺如何通過DDD方法華麗轉(zhuǎn)身的實踐,從這個案例我們了解到遺留系統(tǒng)進行DDD改造過程中的點滴經(jīng)驗。
于靜表示,為了加速數(shù)字化轉(zhuǎn)型與業(yè)務模式創(chuàng)新實現(xiàn),遺留系統(tǒng)的改造會面臨很多難題,比如交付速度慢、應用架構(gòu)不滿足快速迭代需求、技術受限、維護成本高、業(yè)務流程復雜等。而在改造過程中,現(xiàn)有業(yè)務不能停,同時過程難控制、結(jié)果難驗證等問題也非常突出。
為此,遺留系統(tǒng)改造實施需要確立目標與制定策略、業(yè)務梳理、服務改造、集成遷移測試、反饋。在DDD指導下,企業(yè)需要通過事件風暴對業(yè)務討論,審視現(xiàn)有的業(yè)務邏輯,逐步用新應用程序和服務替換特定功能段,增量遷移舊系統(tǒng)。隨著舊系統(tǒng)功能的更換,新系統(tǒng)最終取代了所有舊系統(tǒng)功能。
于靜說,企業(yè)在遺留系統(tǒng)改造中應該遵循“先鋒隊、樹立模范、大部隊”的階段性原則。具體來說,“先鋒隊”階段是挑選規(guī)模較小、功能簡單,業(yè)務較為獨立的功能模塊進行改造,隨著老系統(tǒng)的功能越來越多的被微服務系統(tǒng)所代替,老系統(tǒng)也最終被替代。需要注意的是,當發(fā)生新老系統(tǒng)的功能切換時,應該逐步切換用戶流量,對用戶盡量透明,使得改造過程過渡平滑。
當中臺遇上DDD,如何設計微服務?
當前,中臺、微服務是業(yè)界關注的熱點話題。如果將兩者放到DDD的背景下,如何建立DDD、中臺和微服務的統(tǒng)一語言?如何將三者融合完成協(xié)同設計?《中臺架構(gòu)與實現(xiàn):基于DDD和微服務》作者、極客時間《DDD實戰(zhàn)課》專欄作者歐創(chuàng)新在主題分享中回答了這些問題。
歐創(chuàng)新表示,從企業(yè)架構(gòu)角度來講,業(yè)務中臺屬于業(yè)務架構(gòu)的范疇,業(yè)務中臺重構(gòu)的過程本質(zhì)是基于復用目的的企業(yè)級業(yè)務架構(gòu)重構(gòu)。在業(yè)務量不大的時候,我們用傳統(tǒng)的集中式架構(gòu)就可以解決復雜問題。而當面對海量互聯(lián)網(wǎng)業(yè)務比如雙十一,企業(yè)原來的架構(gòu)就不足以解決業(yè)務和應用的擴展性問題,因此我們需要將原來大的問題域拆小,將單體應用拆分為微服務,進而上云。所以,DDD和微服務都是解決復雜問題的設計思想。
在DDD概念里,如果只從業(yè)務架構(gòu)角度分析的話,中臺本質(zhì)上是從領域到更細的子域劃分過程中的一個橋梁,只從業(yè)務領域角度分析,它可能對應DDD領域中的某一個核心子域或通用子域。
對于DDD與中臺和微服務的關系,歐創(chuàng)新認為,中臺本質(zhì)是領域中的某一個子域,需要抽象并標準化,按照單一職責原則建立可復用的領域模型。微服務是中臺最佳技術實現(xiàn)。DDD是一種可以同時指導中臺業(yè)務建模和微服務設計的方法論,遵循高內(nèi)聚低耦合的原則,完成從業(yè)務端領域建模到應用端微服務實現(xiàn)的無縫落地。
我們看到DDD和中臺設計兩種知識體系的融合需要建立兩者通用語言,團隊通用語言也是DDD不斷強調(diào)的內(nèi)容。一般對于小的項目我們可以直接從問題域開始事件風暴,完成領域建模。而對于企業(yè)級中臺而言,業(yè)務領域非常大,我們需要做好頂層設計,劃分子域,確定中臺的大致邊界,然后基于這個邊界開展事件風暴,劃分限界上下文,完成領域建模,它是一個自上而下的設計過程。
“DDD博大精深,但DDD也不是萬能的‘銀彈’。將中臺和DDD視作一種思維方式和設計思想,結(jié)合企業(yè)實際情況靈活運用才是王道?!睔W創(chuàng)新說。
DDD從戰(zhàn)略設計到代碼落地的三階段方法
ThoughtWorks總監(jiān)級咨詢師楊云指導過多個DDD實施項目的落地,在峰會的主題演講上楊云系統(tǒng)介紹了如何將DDD建模在大規(guī)模開發(fā)團隊的情況下確實的落地到代碼層面。
為什么企業(yè)覺得DDD落地難?楊云表示:“首先,因為DDD進入了更深層的應用。DDD從戰(zhàn)略層面的應用進入到戰(zhàn)術落地層面,而不再僅僅停留在子域劃分、微服務劃分等。其次,參與建模的人,從業(yè)務專家和架構(gòu)師級別的技術專家,深入到產(chǎn)品經(jīng)理、軟件工程師等執(zhí)行具體事務的人員,面臨在百人以上開發(fā)團隊大項目上保證代碼按照模型落地的難度。最后,DDD建模的投入和交付時間點的矛盾、DDD建模投入的即時性和DDD模型收益的長期性之間的矛盾?!?/p>
在DDD落地方面,企業(yè)需要對戰(zhàn)術級別的建模提供更具體、更模式化的指引。對于大規(guī)模項目,設計更明確、與代碼實現(xiàn)直接相關的微觀模型。提供更好的工具降低DDD模型建設和維護成本,提高模型和代碼一致性。
基于此,楊云提出了DDD落地的三階段方法:事件風暴階段聚焦戰(zhàn)略建模、子域劃分、微服務拆分;名詞動詞階段,在子域或微服務內(nèi),細化實體和行為,識別重要角色和重要規(guī)則,建立子域內(nèi)核心概念的結(jié)構(gòu)化模型;類型流階段,微觀展開具體行為,將承載業(yè)務邏輯的純函數(shù)和依賴基礎設施的副作用函數(shù)剝離。
楊云表示,建模是迭代的,不是線性單向的。DDD建模需要考慮團隊工作的細節(jié)層次,采取適當?shù)姆椒ǎ河檬录L暴來做戰(zhàn)略建模、用名詞動詞法做子域內(nèi)的結(jié)構(gòu)化戰(zhàn)術建模、用類型流做行為內(nèi)部的微觀詳細設計。
結(jié)語
DDD從2003年被提出來以后,得到了業(yè)界的高度認可,特別是微服務架構(gòu)、中臺等逐漸盛行,DDD正在加速在企業(yè)業(yè)務實踐中的落地。而領域驅(qū)動設計峰會為DDD社區(qū)提供了一個絕佳的交流與分享平臺,也將極大推動這種進程,更好地促進DDD的發(fā)展。