相同或不同的有界上下文;有或没有传奇;无关紧要。
为什么事件处理失败?域规则或基础结构。
域规则:
由聚合处理的引发事件(事件处理程序使用聚合应用事件)不应按域规则失败。
如果“目标”聚合具有拒绝事件的域规则,则聚合设计是错误的。域规则可以拒绝命令/操作。域规则不能拒绝(或撤消)事件。
当“origin”聚合检查此操作的所有域规则时,应引发事件。“target”聚合应用事件,并可能引发另一个事件,该事件的某些值由“target”聚合计算(域规则,但不用于拒绝事件;域规则不可拒绝事件;但要“继续”一致性“链”,并进行良好的责任分离)。这就是为什么事件应该以过去的句子作为名称;因为已经发生了。
事件模拟:
嘿,伙计们!用户做了这个很酷的事情,一切看起来都很好。-->用户DidThisCoolThingEvent
哇哈,太棒了!我将在用户积分中加上3。-->用户RecipeHomePointsEvent
Agg3:+3指向该用户?用户刚达到100分。太多了!我要把这个用户转换成VIP用户。-->用户已转到vipevent
新的VIP用户?让我们通知其他用户,让他们产生理智的嫉妒;)
基础设施:
修复并应用事件。;)如果需要,甚至可以在持久性引擎、网络和/或机器再次启动时“手动”。
短期自动重试失败。ErrorQueues/Logs以避免在长时间的中断中丢失事件(稍后再应用它)。
事件源也有助于实现这一点,因为您总是可以在“target”aggegate中重新应用持久化事件,而无需额外努力将事件保存在某个地方(即事件日志),因为您的域持久性也是您的事件存储。