为什么整个系统事件溯源是一种反模式?

Why is whole system event sourcing an anti-pattern?

我目前正在设计一个新的企业系统。该系统的目的是跟踪、显示和通知员工客户与公司的互动(即事件)。使用事件源模式来保存所有正在收集的客户 interactions/events 的分类帐似乎非常合适,因为我们所有的额外域对象都来自事件流。然而,我看到一篇文章说基于事件溯源的整个系统是一种反模式。为什么会这样?

https://www.infoq.com/news/2016/04/event-sourcing-anti-pattern

文章引用了 Greg Young 的演讲。相关部分可见 here.

Young 解释说 CRUD 隐藏了 "all kinds of crazy use cases",并给出了纠正拼写错误的例子。

他还指出,在事件源系统中分析的成本可能更高。

一般来说,将不可变事件作为系统给定部分的真实来源,与读取模型分开,会带来成本,不应盲目采用。

Young 建议 "something more like event-driven" 将是顶级架构,而不是 CQRS/event 采购。

这篇文章确实总结了 Greg 在 DDD Europe 2016 上的演讲 "A Decade of DDD, CQRS, Event Sourcing"。

我个人不喜欢这个摘要的标题,因为这绝对不是 Greg 的重点。基本上和往常一样,这取决于

当 Greg 谈到 系统 时,他指的是整个事情。这个 thing,用 DDD 术语来说,有一个上下文映射,有多个有界上下文。通常,在此上下文映射上,您可以识别子域,其中一个或多个可以另外识别为核心域。

当您拥有自己的核心领域时 - 将非常适合高级技术,这是更传统的 DDD 战术模式,例如聚合,还是 "fancier" 诸如 Event-Sourcing 之类的东西。实现确实需要根据上下文需要。

根据您的描述,您很适合 Event-Sourcing。但是您可能会考虑系统的其他部分,例如 customer/contact 管理和员工管理。这些细节应该来自某个地方。这些可能是 CRUD 候选人吗?因此,如果您在这种情况下的核心领域是跟踪员工和客户之间的互动,某种 CRM,您可以决定使用 Event-Sourcing 和 系统的其他部分构建该部分 使用不太先进的技术。

无论如何请记住将所有部分都放在上下文映射中,包括外部系统,然后您会看到 系统 这个词在文章和演讲中的意思。