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