9

當我有點困惑在使用域中的事件來構建模型讀取系統中的流動。特別是,我們如何處理用戶期望數據(及其視圖)在完成命令時發生更改的事實,但是由於我們的系統體系結構(非阻塞調用發佈事件),實際數據庫可能不會在頁面重新加載?在查看顯示的變化使用CQRS和DDD與域事件與ServiceBus

我希望用活動和服務總線CQRS更內嵌移動我們的一個系統的設計。

比方說,我的流轉這樣:

  1. 用戶點擊查看按鈕執行從他們的帳戶刪除付款方式的任務。

  2. 控制器調用PaymentMethodRemovalService並將其傳遞給accountId & paymentMethodId。

  3. 控制器採用AccountRepository檢索帳戶,並呼籲account.RemovePaymentMethod(ID)

  4. 帳戶驗證可能出現的操作和發佈事件PaymentMethodRemovedMessage(帳戶,paymentMethodId)

  5. 由於事件發佈是異步的,我們現在必須從服務器返回並返回控制器視圖 - ,但我們的實際數據尚未更新

  6. 處理程序,IHandle < PaymentMethodRemovedMessage>,聽到該事件,並從DB

所以消除了實際行,什麼是一個人做的?

我可以簡單地說,刪除顯示付款方式的div。這可能適用於AJAX場景,但如果我使用Post-Redirect-Get來支持非JavaScript客戶端,該怎麼辦?然後,我會在我更新之前觸發我的Get並從事物的Query側讀取數據。

難道我只是顯示一個通知說,他們的要求刪除付款方式已提交? (這似乎不友好,對於提交訂單是有意義的,但不適用於改變地址)。

有沒有辦法調和實現變化解耦異步事件和展示反映其電流變化的用戶數據?

編輯:我的問題是非常相似CQRS, DDD synching reporting database我不得不說,考慮到那裏,也提到了這裏的答案,有一點異味,以它的 - 爭論的UI顯示的更新這是帶外與可以這麼說,讀數據庫。我希望有更清潔的東西。

回答

8

如果你陷入了請求/響應模型,你可以採取相關請求/響應模式。有關詳細信息,請查看NSB下載中的異步頁面示例。這演示了ASP.NET設置中的請求/響應。有一些ASP.NET MVC的例子,如果這是更多的東西。

當你介紹異步處理您接受該數據將會過時。人們可以爭辯說,當你查詢數據庫時,數據已經老化(網絡延遲,渲染時間等)。由於數據已經很老了,我們必須問問多大年紀了?

還有一件需要考慮的事情是您的處理有點不合理。步驟3應在將命令發送到服務器之前進行驗證,然後步驟3,4將在6之後進行。數據庫只應在命令有效時更新,並且只有在數據庫成功更新後纔會發佈該事件。

0

此問題被稱爲「最終一致性」。有明確的方法來處理它。第一點是每個系統都有最終的一致性,無論他們是否使用異步事件。只是你選擇了明確,而大多數其他系統只是讓用戶等到更新完成。只要明確選擇,兩種方法都是有效的。

後來我寫了一篇關於這個主題的博客文章,您可能會發現有幫助。你可以在這裏找到它:4 Ways to Handle Eventual Consistency on the UI

這裏是一個簡短的版本:

選項1 - 使用一個確認屏幕。如果您在手機上使用銀行應用,您可能已經看到了這一點。轉入一些錢,在這個過程結束時,你會被帶到一個確認屏幕,然後被帶回你的賬戶。這使得系統時間恢復到最新狀態。

選項2 - 假的。如果用戶嘗試的操作很有可能成功,那麼僞造它可能是一種合理的方法。購買高需求票時通常使用這種方式。您的交易可能會經過,但稍後公司發現您的票已經在毫秒之前售出。對公司的好處是他們有銷售而不是失去兩個客戶的風險。只要系統是小心建立的,這種情況應該很少發生,因此整體上不成問題。

您還可以使用關聯標識來允許您訂閱操作的成功或失敗。

無論如何,希望提供一些思考。