在看到CQRS架構(gòu)之后覺(jué)得很有道理,但是有以下幾點(diǎn)疑問(wèn)
1.CQRS架構(gòu)圖中的在發(fā)生一個(gè)Command之后肯定會(huì)有一個(gè)Command Handle來(lái)做處理,并且Command這是滿足并針對(duì)自身的,但是后面又看到了Command Handle來(lái)調(diào)用Domain,并且Domain在調(diào)用Repository,疑問(wèn)就出現(xiàn)在這里了,為什么Handle要去調(diào)用Domain,還有就是Repository是否要注入到Domain中,還是說(shuō)可以使用Event來(lái)調(diào)用Repository.
2.看CQRS架構(gòu)中出現(xiàn)了Snapeshot和Event Store,疑問(wèn)是SnapeShot跟Event Store之間是否有關(guān)系存在,還有就是SnapeShot跟Event Store兩者區(qū)別在那里.
3.Banq老師說(shuō)到了EJB推崇貧血模式,在CQRS架構(gòu)在集群中是使用事件來(lái)做傳遞的,但是事件是有事件源的,事件在傳遞的過(guò)程中事件源不需要做傳遞么.還是將事件源存儲(chǔ)在某個(gè)中心服務(wù)器上面.
4.Banq老師說(shuō)道ActiveRecord的致命缺陷是:當(dāng)業(yè)務(wù)邏輯復(fù)雜到一定程度,它開(kāi)始崩潰,業(yè)務(wù)邏輯很難維護(hù),一致性保證很困難,更進(jìn)一步說(shuō):實(shí)際上是關(guān)系數(shù)據(jù)庫(kù)掌管了業(yè)務(wù)狀態(tài),關(guān)系數(shù)據(jù)庫(kù)成為單點(diǎn)風(fēng)險(xiǎn)和性能瓶頸,只能走數(shù)據(jù)庫(kù)sharding 等路線進(jìn)行伸縮(本站有更多關(guān)于關(guān)系數(shù)據(jù)庫(kù)問(wèn)題的文章),這里業(yè)務(wù)邏輯復(fù)雜之后會(huì)很難維護(hù)本人不是很明白上述幾點(diǎn)問(wèn)題,還請(qǐng)舉例說(shuō)明.
對(duì)于以上幾點(diǎn)問(wèn)題還請(qǐng)大家詳細(xì)說(shuō)明,謝謝!
---------------------------------------------------------------
1,Commond到達(dá)它被處理的Handler,這通常是一對(duì)一,然后會(huì)觸發(fā)領(lǐng)域模型的交互,因?yàn)闃I(yè)務(wù)邏輯在Domain上,Domain的行為會(huì)生成領(lǐng)域事件,Domain沒(méi)有直接掉Repository,注意那張圖,Domain由Repoisitoy返回,Domain上的事件可能由Reposiotry發(fā)到事件總線。
2,Snapeshot是模型的快照,Event Store是存儲(chǔ)在Domain上的事件,舉個(gè)例子,一個(gè)人從出生就開(kāi)始記錄在它身上發(fā)生的任何事情,然后讓他再出生的一次,同時(shí)把Event Store里事件回放一下就可以還原到它的現(xiàn)在。可想而知,這個(gè)事件太多了,那么就在某個(gè)時(shí)候保存一個(gè)快照,比如在他18歲的時(shí)候,這樣就可以從18歲開(kāi)始回放。
3,這個(gè)看你怎么設(shè)計(jì),可以直接帶事件源對(duì)象或者帶ID,因?yàn)槲覀兺ǔL幚淼氖菍?shí)體對(duì)象,用ID去Repository里取就可以了。Jdon框架帶的只是一個(gè)Object,隨便你放什么。
4,活動(dòng)記錄,和關(guān)系數(shù)據(jù)庫(kù)綁得太死,那么問(wèn)題就是關(guān)系數(shù)據(jù)庫(kù)的問(wèn)題,多搜索一下。
希望對(duì)你幫助!
[該貼被OOjdon于2010-12-18 19:57修改過(guò)]
----------------------------------------------------------------
首先很感謝你的回答,確實(shí)幫助了我很多,但是還有有幾個(gè)問(wèn)題
1.Handle主要做什么,還有Handle來(lái)驅(qū)動(dòng)Domain觸發(fā)事件么
2.SnapeShot是模型的一個(gè)快照,我可以把它看做是一個(gè)帶有時(shí)間標(biāo)識(shí)的緩存么,而Event Store是存儲(chǔ)歷次狀態(tài)事件的存儲(chǔ)點(diǎn),由SnapeShot返回某個(gè)時(shí)間點(diǎn)的模型標(biāo)識(shí)(ModelId),在到Event Store去取出跟此次狀態(tài)有關(guān)的事件么
3.CQRS架構(gòu)的讀寫(xiě)分離,本人不是很明白讀如何進(jìn)行分離,是否需要針對(duì)查詢來(lái)做專(zhuān)類(lèi)的對(duì)象。但是如果使用查詢專(zhuān)類(lèi)對(duì)象的話,那么Domain對(duì)查詢專(zhuān)類(lèi)對(duì)象有用處,因?yàn)閮烧哌€是有所區(qū)分的
----------------------------------------------------------------
1,Handler就是接受到命令然后讓領(lǐng)域模型做事情,這個(gè)Handler我認(rèn)為在某些時(shí)候還可以省略,在JiveJdon中有直接把命令打到Domain上的代碼,領(lǐng)域模型在完成業(yè)務(wù)邏輯的時(shí)候會(huì)產(chǎn)生事件,比如貨物到達(dá)目的地會(huì)有deliver事件,商品有上架事件或被買(mǎi)走事件,領(lǐng)域事件由領(lǐng)域模型扔出來(lái)的,當(dāng)然系統(tǒng)中還有各色各樣的事件。
2,事件回放產(chǎn)生完整Domain,DDD Factory也可以產(chǎn)生完整Domain,有完整Domain才會(huì)有緩存,至于怎么得到這個(gè)完整Domain,你可以事先直接把對(duì)象序列化,或者從數(shù)據(jù)庫(kù)中構(gòu)造。
2010年12月18日 22:06 "spawnyy"的言論
由SnapeShot返回某個(gè)時(shí)間點(diǎn)的模型標(biāo)識(shí)(ModelId) ...
注意,對(duì)象標(biāo)識(shí)是不變的,和時(shí)間沒(méi)有關(guān)系。
3,想象沒(méi)有數(shù)據(jù)庫(kù),數(shù)據(jù)是領(lǐng)域?qū)ο蠼换ネ瓿蓸I(yè)務(wù)邏輯時(shí)的產(chǎn)物,這個(gè)產(chǎn)物被異步到一個(gè)sql或者NoSQL DB保存,然后有人直接來(lái)這個(gè)DB查詢,你怎么查,怎么優(yōu)化,怎么加視圖,加緩存,怎么做DTO,怎么Match你的UI,是你的事,Domain已經(jīng)分析和開(kāi)發(fā)完成,這就是讀寫(xiě)分離。
這是我對(duì)CQRS的理解,大家一起討論吧。
[該貼被OOjdon于2010-12-19 11:10修改過(guò)]
[該貼被OOjdon于2010-12-19 11:13修改過(guò)]
----------------------------------------------------------------
我個(gè)人感覺(jué)也沒(méi)什么必要增加Handle,這里的Command就是命令只要發(fā)送到Domain受理就可以了,但是可能我理解的SnapeShot有點(diǎn)問(wèn)題,這個(gè)快照是一個(gè)模型近期的快照呢,還是歷次的回放?還有就是Event Store每次存儲(chǔ)事件的時(shí)候可以把它看做是一個(gè)存儲(chǔ)器吧,不過(guò)存儲(chǔ)的方式是存儲(chǔ)事件呢還是事件源呢。對(duì)于讀寫(xiě)分離,如何讀這塊需要根據(jù)自己需要去設(shè)計(jì),而不是將Domain去為查詢?nèi)プ鲂┩讌f(xié)的事情,對(duì)么?
[該貼被spawnyy于2010-12-19 11:47修改過(guò)]
----------------------------------------------------------------
Handler可以做權(quán)限等事情,所以是有必要的,保持Domain層的足夠內(nèi)聚,DDD書(shū)中也還有應(yīng)用層到領(lǐng)域?qū)幽兀?br>Domain對(duì)象可能就是一個(gè)不Match UI 和 DB的東西,我們現(xiàn)在不過(guò)是向兩邊妥協(xié)了,所以有Action幾千行,Service幾千行的代碼
Hibernate in Action書(shū)中的案例代碼,DDD sample 使用SSH的方式都不是這樣的。
對(duì)于cqrs,你可以研究下axon這個(gè)框架。該框架實(shí)現(xiàn)的快照是可配置的,做法是直接將對(duì)象序列化,比如配置你18歲,22歲序列,然后就不用回放你18歲之前,22歲之前。
[該貼被OOjdon于2010-12-19 12:16修改過(guò)]
---------------------------------------------------------------
2010年12月18日 19:45 "oojdon"的言論
Commond到達(dá)它被處理的Handler,這通常是一對(duì)一,然后會(huì)觸發(fā)領(lǐng)域模型的交互 ...
其實(shí),這是我認(rèn)為DDD中領(lǐng)域事件的局限性。在我看來(lái),一個(gè)Commond可能會(huì)有多個(gè)handler,甚至還會(huì)有多個(gè)handler的編排,就像ESB里做的一樣。在復(fù)雜的業(yè)務(wù)場(chǎng)景里,一個(gè)對(duì)象的創(chuàng)建常常會(huì)導(dǎo)致多個(gè)對(duì)象的狀態(tài)發(fā)生變化,這還不包括倉(cāng)儲(chǔ)層的響應(yīng)。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。