我正在研究DDD和事件源的編程。如何在DDD中管理域邏輯和事件之間的事務?
我看到一個例子,當域邏輯被調用時(例如Order.placeOrder()
)它會發佈一個事件(例如OrderPlaced
)。事件將作爲事件存儲發送到MQ。
域邏輯(Order.placeOrder()
)應該是原子API,如果使用Spring作爲事務管理器,它應該有@Transactional
註釋。
現在我的問題是:
如何確保DB變化和事件發送是在同一事務中?即如果在將數據提交到數據庫時出現任何錯誤,則該事件不應發送到MQ。
我知道有類似XA或2階段提交的解決方案來強制數據庫更新並在同一事務中發送MQ消息。但似乎現在並沒有被廣泛使用。
如果仍然使用Spring
@Transactional
註釋並且沒有XA,那麼在事務成功提交後我們可以做一些邏輯嗎?最佳做法是什麼?
感謝您的回覆。使用與事件相同的數據庫是事務管理的一種簡單方法。我認爲這對內部事件是有好處的。但是,如果我們需要發佈外部事件以供大量用戶使用。處理案件的做法是什麼?我們是否需要額外的調度程序將事件從數據庫事件存儲移動到ESB產品(如MQ)? –
@RandyHuang這取決於你的環境。您可以使用調度程序,也可以在原始事務結束時觸發「檢查新的域事件」。 – theDmi