我目前正在對這種使用情況:如何處理長時間運行的進程/佐賀用例道口限界上下文
- 預算被分配到一個組織單元
- 邁克使用預算訂單的好
- Jane給出了這個命令的確定,驗證它。這種行爲觸發了這些後果:
- 檢查預算餘額,看看我們是否可以接受此訂單:失敗,通知簡。
- 預算被減少到訂單金額
- 訂單狀態從WAITING_VALIDATION改變爲驗證
- 成功消息被顯示給簡
其他用例的信息:
- 對於我們的用戶來說,從3.1到3.4的步驟必須是實時的。 Jane單擊該按鈕並等待答案:OK或NOT OK 和訂單狀態被確認有效
我在想:
- 預算是有界的上下文。
- 排序是另一個有界的上下文。
- 驗證步驟將更改2個聚合根,這似乎是錯誤的。並添加耦合。如果我們需要同時更新另一個聚合根(步驟3,如爲商品創建會計折舊條目)。
- 是實時的,我們可以使用XA事務(例如SQL +消息傳遞),但我想避免它(此外我目前的技術堆棧不允許我使用XA事務)。
看來,我們可以使用最終一致性達到這種用例的: - 訂購服務要求預算服務來處理processOrder命令(通過短信或REST):在這一點上訂購服務正在等待預算處。 - 預算服務處理命令(在本地事務中)並向呼叫者發送OK/NOK - 預算服務還會發送OrderInBudgetProcessed事件。 - 訂購服務實時接收OK/NOK並通知簡(但訂單狀態此時未更改) - 訂購服務處理OrderInBudgetProcessed並更新本地交易中的訂單狀態。
我認爲這可以工作。但我有一些問題:
- 在訂單狀態未更新期間,Jane無法打印訂單以將其發送給供應商。
- 在訂單狀態未更新的時間裏,我們可以想象,邁克想要取消訂單。狀態仍在等待,因此允許執行「取消」操作。我們是否必須要求BudgetService確認訂單已經處理?如果是的話,那麼我們必須要求所有服務使用他們的狀態命令。我們可以使用類似傳奇或協調員的東西?
- 將賠償訴訟似乎很多工作...
一些問題:
- 「順序確認」 - 的2個步驟組成的 - 主要是由預算上下文或順序處理上下文? (在我看來,主要事件是預算縮減,所以我在考慮預算情況)。似乎邏輯給你?
- 您對這類用例有何看法?太複雜?
- 你如何處理這個問題?
- 我想在同一時間有一個乾淨的代碼(避免更新/同步同一事務中的所有對象的服務)和域用戶(Mike/Jane)滿意,我該怎麼做。
請糾正我在哪裏,我錯了:)
期待您的迴音。
弗朗索瓦
+1。面對類似的問題,我會使用Event機制在有界的上下文中觸發域活動。 – jett 2014-10-13 01:08:00
謝謝你們。你如何向你的領域專家解釋最終的一致性? (當我試圖解釋爲什麼事件適合我們時,我失敗了)。我可以在事件上添加到期時間(強制限制一致性)。例如:我的第一個事件有一個2secondes TTL,之後命令處理程序不會處理這個事件併發送一個新事件EVT_TIMEOUT。似乎對你錯了嗎? – Archange 2014-10-13 12:34:48
@Archange第一個問題:我剛剛告訴他們這種方法可能會改善整個系統,他們說可以。有時候並不那麼簡單,但我認爲專注於商業價值改進總是一個好主意。第二個問題:我有一個輪詢機制,如果訂單處於中間狀態的時間過長,訂單上下文將重新發送事件。爲了達到這個目的,你需要讓事件處理程序訂閱*全部*冪等(可能通過使用事件存儲)。我認爲你的方法也行得通,唯一的問題是如果EVT_TIMOUT永不回頭。 – Hippoom 2014-10-13 14:32:48