我正在学习事件采购模式我无法理解它的一件事.
在许多教程中都有指令不在 DB中存储实体的当前状态.开发人员应构建一个基础架构,用于从与所需实体相关的数据库中提取所有事件("事件流"),然后将它们应用于新的所需类型对象,最后它是当前状态.
让它成为银行账户.要将当前帐户状态返回给我的客户,我必须:
提取所有相关事件(可能在DB中有数千个事件)
计算当时的免费资金数额.
不过性能怎么样?我认为存储每个帐户的当前状态会更好,而新事件会立即产生副作用.我不对吗?
事件来源的全部意义在于将状态保持为一系列变化,因此当前状态与ES相反.
话虽如此,由于性能要求,有时会创建快照,以便不从头开始应用更新,而只从快照向前应用更新.事件存储是针对使用事件源的应用程序的专用数据库,它们可以提供开箱即用的快照功能.
等式的另一部分是ES是对CQRS的补充- 命令查询责任分离模式,它将读写模型分开(前一个链接没有得到它的正确,IMO,你可能想看一下这个).然后,正在执行的命令或域事件用于连续更新读取模型,该读取模型实际上是当前状态的非规范化表示.因此,对于命令,您将从事件(ES)构建域对象并对其执行操作,而对于查询,您将绕过事件存储并直接从读取模型检索数据,读取模型可以是关系数据库,文档数据库或其他内容,这是优化的为您的阅读场景.
如果你有大多数阅读应用程序,那么用ES实现的命令端性能可能不那么重要.
ES的好处超出了这个问题的范围,您可以在互联网上找到相当多的信息(尤其是Greg Young和Udi Dahan).我个人对此持怀疑态度,并认为如果使用长时间运行的业务场景是有意义的.