事件消費者之 Reactor - 事件溯源

xuding發表於2021-07-26


本文轉載自【何以解耦】:codedecoupled.com/php-es-reactor.html

Reactor(反應機)與 Projector 大同小異,唯一的區別在於我們不能重播 Reactor 的行為。 所以 Reactor 生為處理領域中有副作用(side-effects)的行為。

那麼何謂有副作用的行為呢?如果一個行為發生一次與發生多次所產生的結果不同的話,此行為可理解為有副作用。比如當訂單完成(OrderConfirmed)時給使用者傳送一封郵件,此行為有副作用,因為重播訂單完成事件(OrderConfirmed)時,使用者將收到重複郵件。

以下是從我們的實戰經驗中總結出來的 Reactor 用例。

實戰用例

副作用行為

處理領域內有副作用行為是 Reactor 最直觀的用例。比如傳送訂單郵件:

img

聚合間通訊

有時候兩個聚合間需要通過事件通訊來完成一個簡單的流程,這個時候我們可以使用 Reactor。 假設我們建立了兩個聚合,Order 和 Bill。當 Order 確認時,Bill 會自動生成一張 Invoice,我們可使用 Reactor 來完成這兩個聚合間的通訊:

img

這裡需要強調此流程的簡單性是有原因的。如果一個流程是複雜長時的話,我們應該採用 Saga 方案,因為它支援回滾操作。

翻譯領域事件

事件溯源與其它架構模式混合使用時,我們不免要處理跨架構間的通訊,這個時候我們可使用 Reactor。比如在 CRUD 架構中也需要監聽事件溯源中的領域事件,如果我們在 CRUD 直接監聽,就會出現抽象洩漏的情況(領域事件是事件溯源中的抽象概念)。這個時候我們可以使用 Reactor 將領域事件翻譯成 CRUD 中的事件併傳送出去:

img

總結

Reactor 好比一種特殊的 Projector。和 Projector 一樣,它的職責單一且專注,易於編寫單元測試。

本文轉載自【何以解耦】:codedecoupled.com/php-es-reactor.html,如果你也對 TDD,DDD以及簡潔程式碼感興趣,歡迎關注公眾號【何以解耦】,一起探索軟體開發之道。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Know how, know why meanwhile.

相關文章