簡體   English   中英

CQRS按特定順序運行處理程序

[英]CQRS run handlers in specific order

我有2個處理程序的正在運行的訂單刪除和重新排序圖片,並希望為最佳解決方案提供一些建議。

在UI上,一些圖片被刪除,用戶單擊“已刪除”按鈕。 將啟動整個流程,刪除命令,直到事件處理程序實際刪除物理文件為止。

然后,用戶立即將剩余的圖片分類。 從重新排序命令到文件系統的重新排序事件處理程序的新流程再次觸發。

已經存在並發問題。 如果不完成刪除操作,則無法正確應用重新排序。 目前,此問題已通過某種鎖解決。 將創建一個臨時文件,然后在刪除流程結束時將其刪除。 當該文件存在時,另一個線程(根據用戶操作重新排序或刪除)在等待。

這不是理想的解決方案,並且希望對其進行更改。 潛在的解決方案也必須非常快(當然,當前解決方案不是很快),因為在訂購結束時通過JSON調用更新了UI。

在以后的實現中,我們正在考慮使用事件隊列,但目前我們還處於困境。

任何想法將不勝感激! 謝謝你,摩蘇!

編輯:通過在客戶端使用Javascript數據管理器,我們解決了其他最終的一致性問題。 基本上是樂觀主義者並欺騙用戶! :)我開始相信這也是前往這里的方法。 但是,我怎么知道文件系統中的數據何時更改?

這是對此的一種想法。 您到底要重新訂購什么? 圖片? 根據日期。 為什么要為此命令? 該命令的結果將被所有人或僅此特定用戶看到嗎?

我只能猜測,但是看來您在這里有一個演示文稿問題。 無需在寫側以某種順序存儲圖片,這只是名稱和文件存儲鏈接的列表。 您應該做的只是在用戶設置或集合設置中的某個位置存儲一個小字段:日期升序或名稱降序。 因此,您命令重新排序應僅更改此小字段。 然后,當您加載圖庫時,應首先閱讀此字段,並根據此字段加載一個或另一個視圖。 由於現在的商店很便宜,因此您可以在讀取側針對所需的每種分類參數存儲不同排序的集合。

綜上所述,Delete命令在寫側更改了集合,但是Reoder命令只是用戶或集合設置。 因此,這里沒有並發。

更新資料

根據您的評論和澄清。

  1. 當然,您可以並且可能應該一次僅將用戶操作限制為一個。 如果刪除和重新排序的時間相當短。 這始終是要求您實現的用戶體驗類型的問題。 以訂購系統的常見示例為例。 下訂單后,用戶幾乎可以立即在UI中看到該訂單,其狀態將類似於InProcess 很可能您不會允許用戶以任何方式更改順序,這意味着您將不會顯示任何用戶控件,例如“取消”按鈕(當然,這只是一個示例)。 因此,您可以在此處使用此方法。
  2. 如果2個用戶可以修改相同的物理集合,則您別無選擇-您正在使用共享數據,應該有某種同步。 例如,如果您使用的是Sagas,則可能會遇到以下幾種情況:集合重新排序傳奇和刪除傳奇-他們可以合作。 刪除過程首先開始-集合聚合被標記為正在進行刪除,然后在此重新排序傳奇開始后立即嘗試重新排序過程,但是由於刪除傳奇正在進行中,因此應等待DeletedEvent並隨后繼續該過程。如果重新排序操作首先開始,則相同-刪除傳奇應等待某個事件,並在該事件到達后繼續。

更新資料

好吧,如果我們同意不觸摸文件系統本身,而是觸摸代表圖片集合的聚合。 最重要的並發問題可以使用樂觀並發方法來解決-在數據存儲中,通常使用基於聚合ID和聚合版本的唯一約束。

以下是命令處理程序中的典型步驟:

這是命令處理程序遵循的常見步驟序列:

  1. 根據自身優點驗證命令。
  2. 加載聚合。
  3. 在聚合的當前狀態上驗證命令。
  4. 創建一個新事件,將該事件應用於內存中的聚合。
  5. 嘗試保持聚合。 如果在此步驟中存在並發沖突,請放棄,或重試步驟2中的內容。

這是一段時間前對我有幫助的鏈接: http : //www.cqrs.nu/

最多建議會受到歡迎,通常會套用。

有時很難解釋實現的所有細節,但是有一個細節需要提及:我們存儲圖片的方式意味着,在重新排序后,所有圖片路徑(以及所有鏈接)都會改變。

一位同事簡單地刪除了這一部分的好主意。 這意味着即使順序會改變,圖片的路徑也將保持不變。 在UI端,顯示順序中的圖片索引與其路徑之間將存在一個映射,這意味着除了刪除時,不再需要更改文件系統。

由於我們希望對用戶盡可能寬容,因此這是我們的最佳解決方案。 我認為,總的來說,當出現並發問題時,這也是一個好方法。 可以刪除並發嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM