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