2011-06-29 21 views
0

假設我的ReadDatabase中有一個用戶表(使用SQL Server)。在regulare讀/寫數據庫中,我可以在表上放置一個索引,以確保2個用戶不會被添加到具有相同電子郵件地址的表中。如何在CQRS讀取數據庫中假裝重複值

所以,如果我嘗試添加一個用戶與一個emailadress已經存在於我的表爲一個不同的用戶,sql服務器將拋出一個異常回來。

在Cqrs中,我不能這樣做,因爲如果我從領域模型中解耦write到readdatabas,通過將它放在一個asyncronus隊列上,我不會得到拋出的異常,我將返回「OK」到用戶界面,用戶會認爲他被添加到數據庫中,但實際上他永遠不會被添加到讀取數據庫中。

我可以在讀取的數據庫中進行搜索,檢查數據庫中是否存在用戶已經存在的電子郵件地址,如果有,則通過異常返回到用戶界面。但是,如果他們同時按下保存按鈕,我將對數據庫執行2次檢查,並看到數據庫中沒有任何用戶使用電子郵件地址,我發回它沒關係。放在我的隊列中,稍後它會失敗(通過點擊唯一標識符)。

我想從我的EventSource(它是一個SQL Server)加載所有用戶,然後對該集合進行檢查,看看我是否有已經有這個電子郵件地址的用戶。這聽起來有點瘋狂...

你們是怎麼解決它的?

我能看到的是不使用asyncronized隊列,但使用syncronized之一,但會影響性能比較非常糟糕,特別是當你有很多「讀存儲器」寫入方式...

極品一些幫助在這裏...

回答

2

搜索基於CQRS集合驗證將給你解決這個問題。

Greg Young的貼一下擁抱最終一致性的業務影響http://codebetter.com/gregyoung/2010/08/12/eventual-consistency-and-set-validation/

熱雷米Chassaing發佈關於域中發現丟失的總根源http://thinkbeforecoding.com/post/2009/10/28/Uniqueness-validation-in-CQRS-Architecture

相關堆棧溢出的問題:

How to handle set based consistency validation in CQRS? CQRS Validation & uniqueness

+0

不是我想要的答案,但它是有道理的。我確實有一個想法,我可以窺視我的隊列,看看有沒有關於用戶使用同一個電子郵件地址創建/編輯的信息。 –

相關問題