事件采购模式:为什么我不能存储当前状态?

时间:2017-01-20 11:28:21

标签: design-patterns repository-pattern event-sourcing

我学习事件采购模式我无法理解其中的一件事。

在许多教程中都有指示存储DB的实体当前状态。开发人员应构建一个基础架构,用于从与所需实体相关的数据库中提取所有事件("事件流"),然后将它们应用于新的所需类型对象,最后它将成为当前状态

让它成为银行账户。要将当前帐户状态返回给我的客户,我必须:

  1. 提取所有相关事件(可能在数据库中有数千个事件)
  2. 当时计算的免费资金数额。
  3. 然而表现怎么样?我认为只存储每个帐户的当前状态会更好,而新事件会立即产生副作用。我不对吗?

1 个答案:

答案 0 :(得分:6)

事件来源的全部意义在于将状态保持为一系列变化,因此当前状态与ES相反。

话虽如此,由于性能要求,有时会创建snapshot,因此不会从头开始应用更新,而只能从快照向前应用更新。事件存储是针对使用事件源的应用程序的专用数据库,它们可以提供快照功能out of the box

等式的另一部分是ES与CQRS - Command Query Responsibility Segregation模式的互补,它将读写模型分开(之前的链接并没有让它完全正确,IMO,你可能想看看{{3 }})。然后,正在执行的命令或域事件用于连续更新读取模型,该读取模型实际上是当前状态的非规范化表示。因此,对于命令,您将从事件(ES)构建域对象并对其执行操作,而对于查询,您将绕过事件存储并直接从读取模型检索数据,读取模型可以是关系数据库,文档数据库或其他内容,这是优化的为你的阅读场景。

如果你有大多数阅读应用程序,那么用ES实现的命令端性能可能不那么重要。

ES的好处超出了这个问题的范围,您可以在互联网上找到相当多的信息(尤其是Greg Young和Udi Dahan)。我个人对此持怀疑态度,并认为如果能够处理长期运行的业务场景,那就有意义了。