CQRS体系结构样式
Learn
参考:CQRS体系结构样式
Command and Qeury Responsibility Segregation(CQRS=命令和查询责任分离)
CRUD的问题:
- 读取时,执行大量不同的查询,返回具有不同形状的DTO
- 写入时,实施复杂的验证和业务逻辑
造成模型执行太多操作,过度复杂。
读写分离
- 使用命令更新数据
- 命令基于任务,而不是数据(“预订酒店房间”,而不是“将预订状态设置为已预订”)
- 可将命令置于队列上供异步处理
- 使用查询读取数据
- 查询不修改数据库
- 查询返回的DTO不封装任何域知识
物理分离
- 使用查询优化的数据架构。例如,只读库存储数据的具体化视图(materialized view of the data),从而避免复杂O/R映射
- 不同类型的库。例如:写入的可能是关系数据库,读取的是文档数据库
什么时候使用CQRS
* 协作域
* 多名用户访问相同数据
* 读取和写入工作负载非对称
注意:CQRS不是适用整个系统的顶层体系结构。
优点:从略
挑战
- 复杂性。理念虽然简单,便可能导致应用程序设计更复杂,做甚包含事件溯源模式时。
- 消息。通用会使用消息来处理命令发布和更新事件。这样就必须 处理消息失败或重重复消息。
- 最终一致性。读取的数据可能不是最新的。