第22章 事件溯源
领域驱动设计DDD实践者通常喜欢使用CQRS来合并事件溯源作为增强扩展性和性能的基础。
- 将状态存储为快照的限制
如今大部分系统都只是存储了领域模型的当前状态,也就是状态存储为快照,因此不能分析历史行为,无法理解系统是如何变成该状态的,而事件溯源是存储了完整的历史changes数据。
- 通过将状态存储为事件流来获得竞争优势
-
- 时态查询
时态查询,可以追溯用户发生变化的任何时点的状态,且事件流的数据,可以用于帮助市场部门制定市场营销和产品开发决策或者指导试验。
-
- 投影
投影是让你能够从多个流中合并事件以便执行这些类型的复杂时态查询的潜在特性。
类似SQL数据库中的连接查询,在事件存储中,把这个概念称为投影,这就是将一系列输入事件流映射到一个或多个新的输出流上的查询。
如下例子:
回答“在某体育赛事期间某特定人群在某一天中一共进行了多少分钟的通话?”
将所有需要的事件放在单个流中,就能轻易高效地对所有事件进行查询以便找出需要被提取信息的合计值,平均值或者信息的其他部分等。
-
- 快照
将状态作为事件存储的一个后果就是,事件流会增长的非常大,这意味着重现事件所需要的时间会持续增长。为了避免这一性能影响,事件存储要使用快照。
快照是一个事件流中代表重现所有之前事件后的状态的中间阶段。
- 源自事件的聚合
为了得到事件溯源的兼容性,聚合需要面向事件。
DDD实践者发现,使用事件溯源机制下,其聚合更为面向行为,所以事件需要有较高水平的领域事件表述性。
-
- 构造
在为源自事件的领域模型创建聚合时涉及一些关键细节。
1 |
添加事件溯源能力 |
2 |