2

我目前正在對這種使用情況:如何處理長時間運行的進程/佐賀用例道口限界上下文

  1. 預算被分配到一個組織單元
  2. 邁克使用預算訂單的好
  3. Jane給出了這個命令的確定,驗證它。這種行爲觸發了這些後果:
    1. 檢查預算餘額,看看我們是否可以接受此訂單:失敗,通知簡。
    2. 預算被減少到訂單金額
    3. 訂單狀態從WAITING_VALIDATION改變爲驗證
    4. 成功消息被顯示給簡

其他用例的信息:

  • 對於我們的用戶來說,從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)滿意,我該怎麼做。

請糾正我在哪裏,我錯了:)

期待您的迴音。

弗朗索瓦

回答

2

我曾經遇到過類似的情況,辦法弄成這個樣子:

兩個限定語境:庫存和訂貨

當訂單要求fullfilling,訂貨方面所接受的命令它將更新從WAIT_FULLFILL到FULLFILLING的訂單併發出OrderFullfillingRequiredEvent。

庫存上下文訂閱此事件並進行庫存更新,然後它發出帶有訂單跟蹤ID的InventoryUpdatedEvent。

訂單上下文訂閱後一個事件並更新從FULLFILLING到FULLFILLED的訂單。

如果有人想在此期間取消訂單,它將被拒絕,因爲狀態爲FULLFILLING,表示訂單正在等待某種迴應。

等價於您的用例,我認爲它會添加中間狀態WAITING_VALIDATION - > VALIDATING - > VALIDATED。

還需要一些補償,因爲InventoryUpdatedEvent可能永遠不會到來。最令人討厭的問題是在用戶端,也許你需要輪詢後端,使其看起來像實時。

+0

+1。面對類似的問題,我會使用Event機制在有界的上下文中觸發域活動。 – jett 2014-10-13 01:08:00

+0

謝謝你們。你如何向你的領域專家解釋最終的一致性? (當我試圖解釋爲什麼事件適合我們時,我失敗了)。我可以在事件上添加到期時間(強制限制一致性)。例如:我的第一個事件有一個2secondes TTL,之後命令處理程序不會處理這個事件併發送一個新事件EVT_TIMEOUT。似乎對你錯了嗎? – Archange 2014-10-13 12:34:48

+0

@Archange第一個問題:我剛剛告訴他們這種方法可能會改善整個系統,他們說可以。有時候並不那麼簡單,但我認爲專注於商業價值改進總是一個好主意。第二個問題:我有一個輪詢機制,如果訂單處於中間狀態的時間過長,訂單上下文將重新發送事件。爲了達到這個目的,你需要讓事件處理程序訂閱*全部*冪等(可能通過使用事件存儲)。我認爲你的方法也行得通,唯一的問題是如果EVT_TIMOUT永不回頭。 – Hippoom 2014-10-13 14:32:48

相關問題