事件采购:触发他人和重建状态的事件

Kir*_*ein 12 domain-driven-design cqrs event-sourcing

我正在努力了解通过从EventStore重放事件来重建模型时应该发生的事情,特别是当事件可能触发其他事件发生时.

例如,已经进行了10次购买的用户应该被提升为首选客户并接收向他们提供某些促销的电子邮件.

我们显然不希望每次为该用户重建模型时都会发送电子邮件,但是当我们重播第10个时,我们如何阻止这种情况发生PurchaseMadeEvent呢?

kst*_*uch 10

事件链接可能非常棘手并且很容易失控,因此我会尽可能地避免它.例如,在您描述的情景中,我会提出一个UserPromotedEvent(甚至可能使用PromoteUserCommand),但我不会考虑将电子邮件的实际/物理发送作为我的域的一部分.相反,我会创建额外的处理程序/非规范化器,UserPromotedEvent这将注册发送电子邮件的需要很可能与一些额外的检查.之后,另一个进程将收集尚未处理的电子邮件的信息并发送它们.这种方法可以缓解不完全可访问/可扩展的电子邮件网关可能出现的问题.

更一般地说 - 事件链接的需要经常表明你应该考虑为这个过程实现一个Saga.


xel*_*ion 6

你不应该从事件处理程序引发事件 - 只是不要这样做!你应该使用传奇.

在您的情况下,saga订阅PurchaseMadeEvent并发出PromoteCustomerCOMMAND,这会导致CustomerPromoted事件发生.同样,还有另一个预订CustomerPromoted事件和发送SendEmailToPromotedCustomer命令的传奇.当你重播事件时 - 只是不要为CustomerPromoted事件订阅传奇.

这就是命令和事件之间的区别.理解它很重要.事件告诉已发生的事情,命令告诉将发生什么.