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


本文转载自【何以解耦】: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.
xuding
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

感谢你的文章,让我非常受益

如果要说和 php aritsan make:event的事件 最大的区别,你觉得是什么?

是多了Aggregate, Reactor 等,这些概念吗?

2年前 评论
xuding

@liaosp

php aritsan make:event ,我把这个称为事件通知,发送方通过事件的方式通知接收方自身领域的状态更改。大部分情况下发送方不需要等待任何回应。

而事件溯源是将每个状态变化存储为一个单独事件,应用状态通过播放事件来获取,这样一种数据持久化方案。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!