摘要:每個(gè)事物的范圍限定在單個(gè)聚合內(nèi)。當(dāng)然,記住僅僅因?yàn)槭莾蓚€(gè)表的關(guān)系設(shè)計(jì)不易任何方式表明他們是兩個(gè)聚合。一個(gè)捕獲這個(gè)事件,并在每個(gè)指定的聚合上執(zhí)行命令。盡管如此,不得不訴諸于此解決方案,這表明您的聚合的總體邊界并不正確。
什么是聚合:
聚合是一個(gè)更大的封裝單位,而不僅僅是一個(gè)類。每個(gè)事物的范圍限定在單個(gè)聚合內(nèi)。聚合組件的使用期被界限在整個(gè)聚合的生命周期中。 具體的,一個(gè)聚合將會(huì)處理命令,請(qǐng)求事件,并在其中封裝一個(gè)狀態(tài)模型,使其能夠?qū)崿F(xiàn)所需的命令驗(yàn)證,從而維護(hù)聚合的不變量(即業(yè)務(wù)規(guī)則)
聚合和聚合根之間有什么區(qū)別:
聚合形成對(duì)象關(guān)系的樹或者圖。而聚合根是樹的“頂”,它總體上說(shuō)明了聚合并且代表了剩余部分,它很重要因?yàn)樗撬型ㄐ诺牡胤健?/pre>我知道聚合是事務(wù)邊界,但我真的需要在同一個(gè)事務(wù)中事務(wù)更新兩個(gè)聚合。我該怎么辦?
我們應(yīng)該重新思考如下: ①你的聚合邊界 ②每個(gè)聚合的自責(zé) ③你怎么樣才可以僥幸逃脫掉在讀的一端或者在一個(gè)saga中 ④你的領(lǐng)域的真實(shí)的非功能性的需求 如果你寫了一個(gè)解決方案,但是有兩個(gè)或者多個(gè)的聚合以事務(wù)的方式耦合了,那么就說(shuō)明你沒有理解聚合為什么使用GUID作為ID是一個(gè)很好的做法?
因?yàn)樗鼈儯ê侠恚┤治ㄒ唬⑶铱梢杂煞?wù)器或客戶端生成。如何獲取新創(chuàng)建的聚合的ID?
這是一個(gè)重要的見解,客戶端可以生成自己的ID。 如果客戶端生成了GUID并且將其放在創(chuàng)建聚合的命令中,這不是一個(gè)問題。否則,你需要從適當(dāng)?shù)淖x取端進(jìn)行輪詢,其中ID將以最終一致的時(shí)間框架出現(xiàn)。顯然,這種是比在一開始就生成的方式要 脆弱的多的我們應(yīng)該允許聚合間的引用嗎?
從真實(shí)的“內(nèi)存引用”的意義而言,當(dāng)然是不可以的 在寫方面,一個(gè)真實(shí)的從一個(gè)聚合到另外一個(gè)聚合的內(nèi)存引用是不對(duì)和禁止的。因?yàn)榫酆系亩x不允許到達(dá)他自己的外部(如果允許的話,那么意味著聚合不再是事務(wù)邊界,意味著我可以不再去 思考維護(hù)其不變量的能力,他亦阻止了聚合的分隔) 使用字符串標(biāo)識(shí)符引用另一個(gè)聚合是可以的。在寫方面是沒有用的(因?yàn)闃?biāo)識(shí)符必須被視為不透明的值,因此聚合不能到達(dá)自身之外)。讀的一端可能自由的使用這些信息來(lái)進(jìn)行有趣的相關(guān)性如何在一組聚合中驗(yàn)證命令?
這是一種再也無(wú)法通過聚合進(jìn)行查詢了的常見的副作用,有幾個(gè)答案: ①客戶端驗(yàn)證 ②使用讀的一端 ③使用saga ④如果那些完全不切實(shí)際,那么這就該考慮是否是聚合的邊界不對(duì)如何保證整體的引用完整性?
你現(xiàn)在仍在思考外來(lái)的關(guān)系引用,而不是聚合??醋詈蟮哪莻€(gè)問題。當(dāng)然,記住僅僅因?yàn)槭莾蓚€(gè)表的關(guān)系設(shè)計(jì)不易任何方式表明他們是兩個(gè)聚合。聚合設(shè)計(jì)是不同的如何確保新創(chuàng)建的用戶具有唯一的用戶名?
這是一個(gè)常見的問題,因?yàn)槲覀兠鞔_地不會(huì)在寫方面執(zhí)行交叉聚合操作。但是,我們有很多選擇: ①創(chuàng)建一個(gè)已經(jīng)分配了用戶名字的讀取端。讓客戶端可以交互式的以鍵入用戶名的方式查詢讀取端。 ②創(chuàng)建一個(gè)響應(yīng)式的saga來(lái)標(biāo)記和停用那些不過是以用戶名的讀本創(chuàng)建的賬戶(無(wú)論是否是極端巧合或者惡意的或者由于客戶的錯(cuò)誤) ③如果最終的一致性不夠快,那么可以考慮在寫的一端添加一個(gè)小的本地讀取方面得標(biāo)。確保聚合的食物插入該表當(dāng)我下訂單時(shí),如何驗(yàn)證客戶ID是否真的存在?
假設(shè)客戶和訂單都聚集在這里,很明顯,訂單的聚合是不能驗(yàn)證這個(gè)的,因?yàn)檫@意味著到達(dá)了聚合之外了 在事實(shí)之后檢查,在一個(gè)記錄了‘broken’訂單的saga或者僅僅在一個(gè)讀取端。畢竟,訂單的最重要的事實(shí)完全的記錄它,大概任何關(guān)于訂單的收件人的有趣的數(shù)據(jù)將會(huì)被復(fù)制到訂單聚合中 (引用到用戶去訪問其地址是壞的設(shè)計(jì),訂單總是用來(lái)提供一個(gè)特定的地址,無(wú)論是否在未來(lái)客戶改變他們的地址) 能夠使用那些被記錄在破損訂單的數(shù)據(jù)意味著你有機(jī)會(huì)來(lái)拯救它,扭轉(zhuǎn)局面---這使得比下列命令更有意義,因?yàn)檫`反外鍵約束!如何使用單個(gè)命令更新一組聚合?
單一的命令是不能操作一組聚合的。 首先,問問自己你是不是真的需要一個(gè)命令更新多個(gè)聚合,是什么情況導(dǎo)致這個(gè)需求。 然而,你是可以這么做的。允許一種新的“批量命令”。在概念上包含你想要發(fā)布的命令以及一組您要發(fā)布的聚合(指定或明確指定)。寫入段不夠強(qiáng)大到處理這種批量操作,但是它可以創(chuàng)建相應(yīng) 的”批量事件”。一個(gè)saga捕獲這個(gè)事件,并在每個(gè)指定的聚合上執(zhí)行命令。當(dāng)命令失敗的時(shí)候,saga可以視情況調(diào)用rollback或者發(fā)送一封郵件。 這種方法有一些優(yōu)點(diǎn):我們將批量操作的意圖存儲(chǔ)在事件存儲(chǔ)中。saga自動(dòng)回滾或等效。 盡管如此,不得不訴諸于此解決方案,這表明您的聚合的總體邊界并不正確。你可能想考慮改變你的聚合邊界,而不是為此建立一個(gè)saga。什么是分片?
一種在多個(gè)寫入端節(jié)點(diǎn)上分發(fā)大量聚合的方式。我們可以很容易地分解聚合,因?yàn)樗鼈兺耆亲粤⒌摹?我們可以很容易地分割聚合,因?yàn)樗鼈儧]有任何外部引用。聚合可以將事件發(fā)送到另一個(gè)聚合?
不可以 你的聚合和命令處理器這些因素代表性的早已在代碼中使這個(gè)想法無(wú)法表達(dá),但是有一個(gè)更深層次的哲學(xué)原因: 回去重新讀第一個(gè)問題“what"s an aggregate?” 如果你設(shè)法規(guī)避命令處理程序,將事件推向另外一個(gè)聚合,那么你將會(huì)失去聚合的參與驗(yàn)證的變化的機(jī)會(huì)。這就是為什么我們僅僅允許聚合器上的命令處理程序驗(yàn)證的命令創(chuàng)建事件。我能從我的聚合中調(diào)用一個(gè)讀取端嗎??
不可以在CQRS系統(tǒng)中我們么發(fā)送email
在聚合之外的時(shí)間處理器,不要早命令處理程序中執(zhí)行此操作,就像這個(gè)事件由于丟掉了與其他命令競(jìng)爭(zhēng)而不會(huì)被持久化,所以email將會(huì)在一個(gè)虛假的前提下被發(fā)送。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/69915.html
摘要:查詢集參考中列出了聚合函數(shù)的列表。鍵的名稱是按照字段和聚合函數(shù)的名稱自動(dòng)生成出來(lái)的。例如,要得到每個(gè)書店的價(jià)格區(qū)別,可以使用如下注解這段代碼告訴獲取書店模型,并連接通過多對(duì)多關(guān)系圖書模型,然后對(duì)每本書的價(jià)格進(jìn)行聚合,得出最小值和最大值。 Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。 交流群:467338606 網(wǎng)站:http...
摘要:聚合管道介紹的聚合管道將文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理。它是數(shù)據(jù)聚合的一個(gè)新框架,其概念類似于數(shù)據(jù)處理的管道。 聚合管道aggregate aggregate介紹 MongoDB的聚合管道將MongoDB文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理。管道操作是可以重復(fù)的。管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的參數(shù)。aggreg...
摘要:什么是類似于拆分結(jié)果然后對(duì)結(jié)果進(jìn)行分析求值然后再返回新結(jié)果文檔聚合官方運(yùn)用篇個(gè)人總結(jié)案例一案例二案例三案例那么有什么作用呢舉個(gè)例子文檔中有如下幾個(gè)集合集合一集合二集合三我們想篩選出中為的集合理所當(dāng)然我們會(huì)這樣寫當(dāng)然這樣寫是能拿到結(jié) 什么是aggregate aggregate類似于pipe.拆分結(jié)果然后對(duì)結(jié)果進(jìn)行分析求值然后再返回新結(jié)果.. 文檔 MongoDB聚合官方APIMongo...
摘要:什么是類似于拆分結(jié)果然后對(duì)結(jié)果進(jìn)行分析求值然后再返回新結(jié)果文檔聚合官方運(yùn)用篇個(gè)人總結(jié)案例一案例二案例三案例那么有什么作用呢舉個(gè)例子文檔中有如下幾個(gè)集合集合一集合二集合三我們想篩選出中為的集合理所當(dāng)然我們會(huì)這樣寫當(dāng)然這樣寫是能拿到結(jié) 什么是aggregate aggregate類似于pipe.拆分結(jié)果然后對(duì)結(jié)果進(jìn)行分析求值然后再返回新結(jié)果.. 文檔 MongoDB聚合官方APIMongo...
閱讀 3115·2021-10-14 09:42
閱讀 3732·2021-10-11 10:59
閱讀 3030·2019-08-30 11:25
閱讀 3163·2019-08-29 16:25
閱讀 3296·2019-08-26 17:40
閱讀 1354·2019-08-26 13:30
閱讀 1236·2019-08-26 11:46
閱讀 1407·2019-08-23 15:22