架构设计之解析CQRS架构模式!

简介: 架构设计之解析CQRS架构模式!


CQRS叫命令查询职责分离,事实上就是读写分离的意思。

  • 不过这里的读写分离和我们通常所理解的数据库级别的读写分离是两个不同的概念。

CQRS指的读写分离是指在应用程序内部的代码级别的读写分离。

在本文中,我将对此做出详细解释。

CQS思想

CQS:命令和查询分离:Command and Query Segregation

其核心思想是在任何一个对象的方法可以划分为两类:

  • 查询:获取数据,返回查询数据,但不改变数据状态。
  • 命令:改变数据状态,不返回任何数据。

CQRS模式的核心设计理念来自于一条设计原则,即单一职责原则

  • 所谓单一职责原则,指的是一个技术组件只应该负责具体一项职责。
  • 而不应该有多个导致该组件发生状态变化的操作。

基于CQS的思想,任何一个方法都可以拆分为命令和查询两部分,如下:

private int data = 0;
private int update(int value) {
    data += value;
    return data;
}

上述方法既改变了数据,又返回了数据状态。

如果按照CQS的思想,则该方法可以拆成CommandQuery两部分,如下:

private void update(int value) {
    data += value;
}
private int query() {
    return data;
}

对于命令侧是否返回数据实际业务诉求中并不一定能够完全统一。

比如:

  • 某些业务场景下可能会有返回业务主键的诉求,比如下单操作返回订单号。

基本原则

CQS的主要原则是:

  • 一个方法要么是命令,要么是查询,但不能两者兼有。
  • 这种分离有助于提高代码的可读性和维护性,因为它明确了方法的用途。

CQRS架构

Command and Query Responsibility Segregation
  • 即命令查询职责分离,是一种将命令和查询的责任明确分离的架构模式。
  • 这种模式进一步扩展了CQS的思想,适用于更大规模的系统架构。

架构思想:

CQRS将系统的读操作和写操作分离到不同的模型中:

  • 命令模型(Command Model):
  • 处理数据的写操作(创建、更新、删除)。
  • 查询模型(Query Model):
  • 处理数据的读操作(查询)。

这种分离可以通过不同的数据模型、数据库甚至服务来实现,从而优化读写性能和可伸缩性。

CQRS 模式的应用非常简单,如下图所示:

假设服务为 UserService,在非CQRS模式下同时包含了查询和更新服务接口。

public class UserService {
   //  根据id查询用户
    UserId getUserId(int userId);
    // 更新用户
    void updateUser(User user);
}

应用CQRS模式之后的UserService被拆分成了两个接口,分别承担查询和写职责。

/**
   命令服务
*/
public class UserCommandService {
    void updateUser(UserCommand command);
}
/**
   查询服务
*/
public class UserQueryService{
    User getUserById(int userId);
}

最终一致性

采用CQRS后,查询和命令两侧通常会采用独立的数据模型

  • 采用CQRS模式并没有强制要求必须要进行数据模型的分离。

在这种架构模式下,命令侧的数据变化后及时同步(事件、消息队列)到查询侧,两侧数据并非实时。

  • 在一定的延时后两侧数据最终达成一致。

最后总结

CQRS的使用者可以根据实际情况,将读写分离开单独部署,然后引入领域事件,使用消息队列做通信。

  • 但是这些都是基于不同业务场景的架构选择,而非CQRS本身的要求。
  • 实际上CQRS只是一种非常简单的模式而已,并没有和事件、消息队列这些有强关联。

读写分离部署+消息通信:

  • 会带来额外的系统复杂性和更高的运维成本。

《重构:改善既有代码的设计》的作者也提醒要小心使用CQRS,不推荐将CQRS复杂化处理。

参考资料:

  • CQRS 模式
  • 在微服务中应用简化后的 CQRS 和 DDD 模式

相关文章
|
9月前
|
运维 负载均衡 微服务
|
9月前
|
数据采集 机器学习/深度学习 人工智能
YOLOv11浅浅解析:架构创新
YOLOv11是YOLO系列最新升级版,通过C3k2模块、SPPF优化和解耦检测头等创新,显著提升检测精度与速度,mAP提高2-5%,推理更快,支持多平台部署,适用于工业、安防、自动驾驶等场景。
|
9月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
2278 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
34_GPT系列:从1到5的架构升级_深度解析
大型语言模型(LLM)的发展历程中,OpenAI的GPT系列无疑扮演着至关重要的角色。自2018年GPT-1问世以来,每一代GPT模型都在架构设计、预训练策略和性能表现上实现了质的飞跃。本专题将深入剖析GPT系列从1.17亿参数到能够处理百万级token上下文的技术演进,特别关注2025年8月8日发布的GPT-5如何引领大模型技术迈向通用人工智能(AGI)的重要一步。
959 2
|
8月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
1318 3
|
9月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
9月前
|
Java 数据库 数据安全/隐私保护
Spring Boot四层架构深度解析
本文详解Spring Boot四层架构(Controller-Service-DAO-Database)的核心思想与实战应用,涵盖职责划分、代码结构、依赖注入、事务管理及常见问题解决方案,助力构建高内聚、低耦合的企业级应用。
1694 1
|
边缘计算 Kubernetes 物联网
Kubernetes 赋能边缘计算:架构解析、挑战突破与实践方案
在物联网和工业互联网快速发展的背景下,边缘计算凭借就近处理数据的优势,成为解决云计算延迟高、带宽成本高的关键技术。而 Kubernetes 凭借统一管理、容器化适配和强大生态扩展性,正逐步成为边缘计算的核心编排平台。本文系统解析 Kubernetes 适配边缘环境的架构分层、核心挑战与新兴解决方案,为企业落地边缘项目提供实践参考。
806 0

推荐镜像

更多
  • DNS