当前位置:  开发笔记 > 前端 > 正文

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

如何解决《事件采购模式:为什么我不能存储当前状态?》经验,为你挑选了1个好方法。

我正在学习事件采购模式我无法理解它的一件事.

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

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

    提取所有相关事件(可能在DB中有数千个事件)

    计算当时的免费资金数额.

不过性能怎么样?我认为存储每个帐户的当前状态会更好,而新事件会立即产生副作用.我不对吗?



1> Zdeslav Vojk..:

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

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

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

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

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


大约6到7年前,我正在从事一个不使用ES / CQRS但使用“正常”域模型的项目。由于NHibernate用于ORM,因此我可以使用[拦截器](http://nhibernate.info/doc/nhibernate-reference/events.html)-在每个模型更新/保存/删除中,我都获得了修改字段的列表和存储的字段名称和值以及发起操作的用户的用户名。几行代码即可完成审计跟踪。
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有