2012-09-17 61 views
1

我有一個傳奇服務ProcessCatalog,對產品 負責目錄發佈過程。與NServicebus競爭條件和服務實施

客戶端應用程序向其發送PublishCatalog消息;每條消息包含 catalogid和項目列表。

我選擇了catalogid作爲SagaId。

ProcessCatalog服務是一個長期運行的業務流程,它安排合適的 訂購其他業務服務。

我需要ProcessCatalog記住當前目錄項目組成 驅動器發佈過程。

會發生什麼情況相同的用戶是否擊中的第一時間上UI按鈕發送 PublishCatalog(採用catalogId = 1,ITEMLIST = {A,B,C}),然後改變目錄 組合物(itemList中= {A,d ,E}),所以點擊UI按鈕上的另一次發送 另一個PublishCatalog爲相同的CatalogId?

如果我的ProcessCatalog端點配置了一個workerthread,所有的作品 罰款(我認爲)。但是,如果workthread大於1並且以併發方式處理消息,會發生什麼情況?如果第二個線程在第一個線程之前完成 執行,會發生什麼?

我問我這是一個商業設計錯誤還是一個正常的技術問題。

回答

0

由於佐賀是管理狀態,兩條消息應該關聯到相同的佐賀。在你的佐賀你將不得不處理每條消息並解決任何衝突。業務規則必須定義在目錄發佈過程中如果更改目錄會發生什麼情況。

可能是佐賀被允許完成,並由另一個佐賀來修改目錄。通常在產品目錄中,消費者只關心當前的情況,並且能夠在初始發佈後吸收更改。如果有大量工作要發佈,那麼您可能需要取消佐賀並重新啓動它。如果是這種情況,那麼UI可能需要更多地轉化爲建模工具,用戶可以在該模型中使用該目錄,然後在完全滿意時提交。

+0

嗨亞當,從商業的角度來看,你是對的,我理解你的觀點。但是,我的疑問是相對於種族情況的情況。 如果workthread大於1並且2個消息在併發中處理,會發生什麼情況?如果第二個線程在第一個線程之前完成執行會發生什麼? 我應該鎖定相對於目錄ID的傳奇行? – Alberto

+0

我不認爲你有一個併發問題,但如果你這樣做,將是一個行上的鎖,然後第一級重試會發生,它會先到先得。 –