【发布时间】:2017-06-29 07:19:19
【问题描述】:
命令查询职责分离/事件溯源架构非常适合我正在启动的项目,该项目每年将处理大约 10 亿次与人民健康保险相关的金融交易。主要好处是审计历史记录、可扩展性、在多个团队中强制执行异步兼容的 UI、将这些事务从读取数据库中分离出来、通过事件队列轻松将状态传输到间歇性连接的现场办公室,以及应对重大的业务逻辑变化在整个系统生命周期内。
但是,CQRS/ES 在某些领域会出现问题,例如为 1 亿人分配数字 ID,最终一致性不可接受的用户安全。系统中还有一些区域本质上是 CRUD,并且不会从 CQRS/ES 中受益。最后,我们将在不同的团队和公司中拥有大量开发人员,并且拥有不需要 CQRS/ES 能力的领域会很好。是否可以采用混合方法,其中某些区域不是事件来源?我们可以在读写端同步相关表吗?
CQRS 架构的聚合实体是否简化了快照缓存失效?任何更新可能被缓存的聚合实体的事件都可以被失效器监听,并且给定的聚合实体比关系实体的粒度更粗,我们可以区分写入事件,这个问题是否可以解决?
我预计每年大约有 10 亿个事件,并且需要跟踪大约 4 年的历史。我们可以对旧事件进行快照和存档吗?
是否有度的事件溯源?例如,一个在线商店系统AddLineItem 事件可能包括每单位的行项目价格,但依赖于读取方提取并呈现发票上的产品名称。另一个在线商店可能会在事件数据中包含该名称。您如何选择要在活动中包含的内容?在健康保险中,它可能会限制可以运行的“假设”分析 - 如果我们没有包括被保险人的年龄,我们就无法可行地模拟需要它的政策?
有没有一种有趣的方式来为事件建模?例如,管理员在系统中输入产品的价格将在未来某个日期发生变化。我想快照将是一个价格时间表。我们可以改为添加一个过期的 ProductPriceChanged 事件吗?我们可以在运行“假设”场景时伪造此类事件吗? (此类聚合必须很少更改,以避免版本号和并发检测问题。)
通常声称 CQRS/ES 可以使系统更容易适应未来的业务流程变化。我理解使用通用语言列出事件的命令使得讨论和重新配置它们变得更容易的论点,并且事件溯源消除了 RDBMS 模型的一些僵化。但是,一个事件内的任何变化不会破坏事件的重播吗?随着系统的变化,您最终不会有许多版本化的事件吗?例如,在网上商店通过改变标准来评估客户是否是金卡持有者?你能把所有东西都拍下来吗?您将如何发布这些更改的日期?同样,您是否必须小心依赖注入,因为注入的任何依赖都不会影响业务逻辑,否则会破坏重放?
知道为什么它与 .NET 世界相关,而在行业的其他领域不太受欢迎吗?
非常感谢即使只是阅读。
【问题讨论】:
标签: architecture cqrs event-sourcing