? ? ? ?隨著微服務(wù)架構(gòu)的興起,微服務(wù)設(shè)計與拆分的的最佳實(shí)踐DDD已然成為大家討論與實(shí)踐的熱點(diǎn),如何用DDD建模來實(shí)現(xiàn)微服務(wù)設(shè)計,整個行業(yè)都在探索,事件風(fēng)暴作為最接地氣的實(shí)踐,在不同的項(xiàng)目中野蠻生長,不段演進(jìn),今天已經(jīng)漸漸的走向成熟。作為事件風(fēng)暴的靈魂領(lǐng)域事件而言,是值得投入更多的精力去設(shè)計與打磨。
? ? ? ?領(lǐng)域事件是用特定方式(己發(fā)生的時態(tài))表達(dá)發(fā)生在問題域中的重要事情,是領(lǐng)域通用語言(UL)的一部分。為了方便理解這個概念,這里舉一個寵物的例子:如果做為寵物主人,你的問題域是如何養(yǎng)好一只貓,那么是不是已經(jīng)打了疫苗,給寵物飼喂食物等將成為你關(guān)注的事情,領(lǐng)域事件會有:疫苗已注射,貓糧已飼喂等。如果你是寵物醫(yī)生,問題域是如何治好寵物的病,關(guān)注的事情是寵物的身體構(gòu)成,準(zhǔn)確的診斷寵物病情,對癥下藥,領(lǐng)域事件會有:病情已確診,藥方已開治。雖說二者關(guān)注的都是寵物,在不同的問題域下領(lǐng)域事件是不同的。

???????DDD的提出者和圈內(nèi)的大師先后提到領(lǐng)域事件在領(lǐng)域建模中的價值,前沿實(shí)踐者們已經(jīng)開始應(yīng)用領(lǐng)域事件來表達(dá)業(yè)務(wù)全景。在DDD建模過程中,以領(lǐng)域事件為線索逐步得到領(lǐng)域模型已經(jīng)成為了主流的實(shí)踐,即:事件風(fēng)暴。
??????事件風(fēng)暴是以更專注的方式發(fā)現(xiàn)與提取領(lǐng)域事件,并將以領(lǐng)域事件為中心的概念模型逐漸演化成以聚合為中心的領(lǐng)域模型,以快速可落地的方式實(shí)現(xiàn)了DDD建模。對于高質(zhì)量的事件風(fēng)暴,首先要解決識別領(lǐng)域事件的問題,理想的情況下領(lǐng)域?qū)<液脱邪l(fā)團(tuán)隊一起參加事件風(fēng)暴,從業(yè)務(wù)的視角去分析涉眾關(guān)心的領(lǐng)域事件,短時間內(nèi)高度可視化交流,集中思考,快速發(fā)散收斂形成所有參與者一致認(rèn)可的領(lǐng)域事件集合。在多個項(xiàng)目上實(shí)事件風(fēng)暴后,總結(jié)了一些坑和應(yīng)對辦法,供大家參考:
1. 組織沒有領(lǐng)域?qū)<?/h4>
???????對問題域有深刻見解的主題專家稱為領(lǐng)域?qū)<?,在大多?shù)組織中沒有這個角色,當(dāng)DDD建模需要領(lǐng)域?qū)<抑С謺r,組織往往找業(yè)務(wù)部門的業(yè)務(wù)人員,BA,產(chǎn)品經(jīng)理或在這個領(lǐng)域有多年開發(fā)經(jīng)驗(yàn)的DEV來充當(dāng)。這些一線業(yè)務(wù)人員和開發(fā)團(tuán)隊都清楚有什么功能,但往往不清楚為什么有這些功能。舉個例子:如果我們的問題是打開一瓶紅酒,你去調(diào)研每天都會打開酒瓶的waiter, 給你的答案是:開瓶器。但換做領(lǐng)域?qū)<业囊暯莵砜?,會回歸問題的本質(zhì),如果我們希望打開酒瓶,需要把瓶塞移除,移除瓶塞的方式有多種,包括推,撬與拉拽,對于拉拽可能基于吸力或螺旋拉拽,下面右圖的開瓶器只不過是螺旋拉拽的一種解決方案。領(lǐng)域?qū)<覒?yīng)該對問題域及其中的各種可行方案有更深入的理解。

???????在輔導(dǎo)團(tuán)隊的過程中,為了彌補(bǔ)這部分視角的缺失,往往會在事件風(fēng)暴之前,組織業(yè)務(wù)愿景和場景分析,與被指派的業(yè)務(wù)干系人對齊了業(yè)務(wù)愿景,一起分析業(yè)務(wù)場景背后的問題域,找到問題域的本質(zhì)后再展開事件風(fēng)暴。
2. 面向復(fù)雜業(yè)務(wù)系統(tǒng)的事件風(fēng)暴
???????高效事件風(fēng)暴的規(guī)模推薦5-8人,超過8人的事件風(fēng)暴就會出現(xiàn)討論時間過長,部分成員參與度不高,業(yè)務(wù)之間的相關(guān)度弱等問題。在一個以支付中臺為主題的事件風(fēng)暴中,對于電商商城的支付與理財產(chǎn)品的支付相關(guān)性就很弱,各自關(guān)心的是自己的業(yè)務(wù),讓這兩組人在一起討論,在得到同樣產(chǎn)出的情況下,會花費(fèi)雙倍的時間。
???????在處理復(fù)雜問題時,一個有效又好用的方法就是分而治之,對于復(fù)雜系統(tǒng)的事件風(fēng)暴也是同樣如此。在業(yè)務(wù)干系人達(dá)到一定規(guī)模后,將業(yè)務(wù)干系人分成多組,組織多輪事件風(fēng)暴,迭代演進(jìn)領(lǐng)域模型也是一種不錯的選擇。
???????分組的基本原則應(yīng)以業(yè)務(wù)線為線索,如果目標(biāo)系統(tǒng)的業(yè)務(wù)干系人在同一個業(yè)務(wù)主線上,每一組人代表業(yè)務(wù)主線上的一個環(huán)節(jié) (如下圖), ?這種情況按照業(yè)務(wù)結(jié)點(diǎn)進(jìn)行分組即可。對于業(yè)務(wù)相對簡單的結(jié)點(diǎn),可以將其與相臨結(jié)點(diǎn)合并組織事件風(fēng)暴。

???????當(dāng)目標(biāo)系統(tǒng)是多條業(yè)務(wù)線上的某幾個公共結(jié)點(diǎn),一般業(yè)務(wù)中臺會出現(xiàn)這種情況,如支付中臺要為不同的業(yè)務(wù)部門(保險,商城,還信用卡等)提供支付服務(wù),如下圖中的虛線部分。這類業(yè)務(wù)往往結(jié)點(diǎn)之間的邊界并沒有那么清楚,系統(tǒng)做什么與不做什么只有在梳理完整條業(yè)務(wù)線才能確認(rèn)下來,這種情況按每條業(yè)務(wù)線分組展開事件風(fēng)暴,然后針對多組產(chǎn)出結(jié)果進(jìn)行統(tǒng)一業(yè)務(wù)概念抽象,建立系統(tǒng)邊界內(nèi)的統(tǒng)一事件流。

3. 業(yè)務(wù)代表或領(lǐng)域?qū)<矣米约旱恼Z言表達(dá)業(yè)務(wù),不符合領(lǐng)域事件的規(guī)格
???????事件風(fēng)暴的第一個環(huán)節(jié)是讓參與者頭腦風(fēng)暴,各自找出業(yè)務(wù)干系人關(guān)注的領(lǐng)域事件,對于業(yè)務(wù)干系人來講,往往不適應(yīng)把自己理解的業(yè)務(wù)按領(lǐng)域事件的方式表達(dá)出來,他們看到一串領(lǐng)域事件,也不覺得這種表達(dá)方式比傳統(tǒng)方式直觀,在這種情況下,我們就需要考慮如何引導(dǎo)業(yè)務(wù)共同輸出領(lǐng)域事件。留心領(lǐng)域?qū)<以诒磉_(dá)需求過程中的一些模式:
???????1). 當(dāng)…
???????2). 如果發(fā)生…
???????3). 當(dāng)…的時候請通知我
???????4). 發(fā)生…時
???????通過模式中的關(guān)鍵字轉(zhuǎn)換成領(lǐng)域事件,按時間順序排序后,基于商業(yè)模式與價值定位與領(lǐng)域?qū)<矣懻擃I(lǐng)域事件,以統(tǒng)一的語言與統(tǒng)一的業(yè)務(wù)視角修正并驗(yàn)證領(lǐng)域事件。高質(zhì)量的領(lǐng)域事件定義自然是清楚的,是可以找到問題域中的某個actor是關(guān)注它的,通過講述領(lǐng)域事件是可以體現(xiàn)商業(yè)價值的。
4. 事件風(fēng)暴可能識別不出來所有領(lǐng)域事件
???????通過事件風(fēng)暴可以快速的把整個問題域主線梳理出來,這樣的產(chǎn)出是相當(dāng)?shù)母咝Ш陀袃r值,但對于正在嘗試用事件風(fēng)暴成果代替?zhèn)鹘y(tǒng)交付物的組織,往往會質(zhì)疑事件風(fēng)暴是否可以發(fā)現(xiàn)所有領(lǐng)域事件。
???????試考慮一個投資者,為一座摩天大樓的建造提供資金,投資者未必對建造過程的細(xì)節(jié)感興趣,材料的選擇及各種工程細(xì)節(jié)會議對于建造者來說是很重要的活動,對于投資者來講,感興趣的是良好的投資回報,保護(hù)投資免受風(fēng)險,較為務(wù)實(shí)的投資者會設(shè)立明確的里程碑,每個里程碑通過后再做下一次注資。例如,在項(xiàng)目開始時,提供適量資金進(jìn)行建筑設(shè)計工作。當(dāng)建造事宜被批準(zhǔn)時,再為項(xiàng)目提供較多的資金以進(jìn)行設(shè)計工作。在設(shè)計通過評審?fù)ㄟ^后,才拔給更大量的資金,以便建造者破土動工。梳理得到事件如下:

??????系統(tǒng)建模同理,我們不關(guān)注所有事件,僅關(guān)注對干系人解決特定問題有價值的事件,并且這個特定問題應(yīng)該已經(jīng)在項(xiàng)目初期,業(yè)務(wù)愿景梳理的過程中在組織內(nèi)達(dá)成了共識,就像上述投資者關(guān)注的問題一樣清楚,在業(yè)務(wù)場景梳理與事件風(fēng)暴的過程中,不斷的還原具體過程,以確保識別出的活動或事件真正可以解決業(yè)務(wù)問題。所以在事件風(fēng)暴的過程中,并不需要擔(dān)心是不是找出所有領(lǐng)域事件,只要真正解決了業(yè)務(wù)問題就好了。
???????另外,當(dāng)開始采用新的方法論時,實(shí)踐過程與角度都有差別,舊有體系的交付物不適用是常有的情況,重點(diǎn)關(guān)注的新的方法會不會以更簡潔的方式解決實(shí)際問題。在存疑的風(fēng)險處,活學(xué)活用新方法的交付物能夠讓組織更順利的落地,當(dāng)然必要的開發(fā)過程與交付物改進(jìn)也是需要的,即可以更高效的完成設(shè)計工作,也能夠讓團(tuán)隊更專注在問題上。
總結(jié)
???????有人說微服務(wù)的設(shè)計與拆分是一門藝術(shù),經(jīng)驗(yàn)性的成份占了很大比重。當(dāng)我們準(zhǔn)備基于經(jīng)驗(yàn)來做微服務(wù)的設(shè)計決策時,結(jié)合業(yè)務(wù)愿景,找出問題域內(nèi)所有業(yè)務(wù)干系人真正關(guān)心的領(lǐng)域事件,展開完整的事件風(fēng)暴,循序漸進(jìn)的讓場景變得更加具體,讓經(jīng)驗(yàn)與藝術(shù)在生動的問題域之中得到最大的發(fā)揮。另一方面,有效的識別領(lǐng)域事件,即統(tǒng)一了語言,又助力在模型中體現(xiàn)出業(yè)務(wù)價值部分,為設(shè)計關(guān)注業(yè)務(wù)價值的領(lǐng)域模型打下了堅實(shí)的基礎(chǔ)。