命令查询职责隔离(CQRS)
上下文
我们已经使用了微服务架构模式和每个服务使用一个数据库模式。因此,实现连接来自多个服务的数据的查询不再简单。此外,如果我们使用了事件溯源模式,则不再容易查询数据。
问题
如何在微服务架构中实现多个服务中检索数据的查询?
解决方案
定义一个视图数据库,它是一个只读副本,目的在于支持查询。应用通过订阅拥有数据的服务发布的领域事件来保持副本与数据一致。
例子
-
微服务架构设计模式书中的FTGO示例应用有
Order History Service
,它实现了这种模式 -
几个基于Eventuate的示例应用说明了如何使用此模式
结果上下文
这种模式的好处
- 支持多个可扩展且高性能的非规范化视图
- 改进的关注点分离 = 更简单的命令和查询模型
- 在事件源架构中是必须的
这种模式的弊端
- 增加复杂度
- 潜在的代码重复
- 复制之后/最终一致的视图
相关模式
- 在每个服务一个数据库模式下需要这种模式
- API组合模型是一种替代解决方案
- 领域事件模式生成事件
- CQRS通常与事件溯源一起使用
推荐阅读
- Eventuate, 一个用于开发事务性业务应用的平台
- 《微服务架构设计模式》
- CQRS Pattern With Spring Boot
- Observations on using the CQRS Pattern in HMH
全文完