2010-08-05 96 views
6

我有以下的情況下,我需要實現CQRS模式如下:CQRS - 最終一致性

  1. 用戶登錄
  2. 用戶輸入一些保險細節
  3. 用戶請求的決定要應用
  4. 用戶查看

這似乎是相當簡單的決定的結果,但是我PROBL em在步驟3和步驟4之間,在步驟3,我發送一個ApplyForDecision命令,該命令將從承保服務中得到一個決定,然後將該決定結果的事件發送到BUS,供讀取存儲器稍後使用並更新視圖表與決策結果。

問題出在用戶界面上,我如何讓用戶知道該決定正在被應用,因爲在CQRS中,讀取模型沒有更新(直接),我如何讓UI顯示正在進行決策並且會很快到達?

我還需要給用戶註銷並重新登錄,因爲該決定可能還沒有被應用的能力,如何使用戶界面顯示「待處理的決定屏幕」?

+0

用戶界面是Web客戶端還是智能客戶端? – stung 2010-08-18 21:29:27

+1

以任何方式改變狀態嗎?我的意思是,這是決定應用程序的某種形式的計算,需要確認嗎?如果是這樣,系統中的「其他」是否可見?這種情況如何高度協作? – 2010-12-10 20:17:03

回答

3

恕我直言的解決辦法是讓你的命令發出「ApplyForDecisionRequested」和「ApplyForDecisionHandled」事件,並相應地更新您的閱讀模式。

7

答案是立即提高表明已申請,更新讀DB和馬上重定向到您作出決定之前畫面是否讀DB已經通過時間更新決策的事件。靜態文本'將要聯繫的待決決策'或者其他內容。他們可以刷新或稍後回來,並且很可能會獲得真實的數據。然後,當決​​定已經決定時,你有一個DecisionMade事件並更新讀取的數據庫,發送電子郵件,無論如何,相應地。

這就是您必須在CQRS中處理的最終一致性。通常,當我對錶單上的域對象屬性進行更改時,我會在用戶獲得即時反饋時將其僞造,而後端完成它的雜事。是的,有點醜,但用戶不知道。

+2

很好的答案,特別是關於用戶不知道的。這是關鍵,確保用戶不會注意到。例如,您可能會在瀏覽器或服務器緩存中存儲該項目已更新。當您訪問數據和緩存中的readmodel時,您會注意到數據尚未更新,您自己也可以這樣做,但僅限於此用戶。 SignalR也非常適合儘快更新其他客戶端。 – 2013-08-04 07:30:58