场景
使用微服务架构模式和每个服务一个数据模式会导致实现从多个服务查询关联数据不在简单明了了。并且,如果使用了事件溯源模式,那么数据也不在容易被查询出来。
问题
如何在微服务架构中实现查询?
解决方案
将应用分成两个部分:命令方面和查询方面。命令方面出来创建,更新和删除请求,并且在数据改变时,产生事件。查询方面通过执行对于一个或多个物化视图的查询来处理查询,这些物化视图通过订阅由数据更新而产生的事件流来保持更新。
例子
用户和订单是使用事件溯源和CQRS的一个实例应用。该应用使用Java编写和Spring Boot。使用Eventuate构建,Eventuate是个基于事件溯源和CQRS的应用平台。
该应用维护一个在MongoDB里面的CQRS视图。每个文档包括关于用户和订单信息。通过订阅用户和订单事件来更新视图:
OrderHistoryViewService使用Spring Data来更新MongoDB。
影响
该模式有如下的优点:
在事件溯源架构中是必需品。
提高了关注点的分离,简化了命令和查询模型。
支持多种可以被扩展和性能好的非规格化的视图。
该模式有如下的弊端:
增加了复杂性
潜在的代码重复
同步复制慢/最终一致性视图
文章来源:Pattern: Command Query Responsibility Segregation (CQRS)