2011-06-08 97 views
7

我是DDD的新手,現在我正在閱讀文章以獲取更多信息。其中一個articles側重於域事件(DE)。例如,發送電子郵件是在執行一段代碼時滿足一些條件後引發的域事件。域驅動設計和域事件

代碼示例顯示的處理域事件中的一種方式,並遵循本款

請注意,上面的代碼將在同一個線程在同一事務中的常規域工作,讓你運行應避免執行任何阻止活動,例如使用SMTP或Web服務。相反,更喜歡使用單向消息傳遞給其他阻止活動的其他人。

我的問題是

  1. 這是在處理DE的一個普遍問題?或者只是關心上述文章中的解決方案?
  2. 如果在事務中引發域事件並且系統不會同步處理它們,那麼應如何處理它們?
  3. 當我決定序列化這些事件並讓調度程序(或任何其他機制)執行它們時,事務回滾時會發生什麼? (在文章中的事件是在事務中執行的代碼中引發的)誰將取消它們(當它們沒有被持久化到數據庫時)?

感謝

回答

8

這是一個普遍的問題時間段沒關係DDD

在一般情況下,在其以高性能的方式來響應要求(任何系統如Web服務器,任何長時間運行的活動應異步處理的觸發過程。

這意味着隊列。

回滾您的交易應該從隊列中刪除的項目。

當然,您現在需要額外的機制來處理隊列中的項目無法處理的情況 - 即電子郵件未發送 - 您還需要在觸發代碼中允許此操作 - 具有後續進程依靠已經發生的早期過程會在某個時候引起問題。

簡而言之,您的排隊機制本身應該是事務性的並且允許重試,並且您需要將整個事件鏈作爲工作流考慮。