Architecture Patterns
CQRS
读写分离模式
Command Query Responsibility Segregation (CQRS) 是一种架构模式,把系统操作分成 command 与 query。由 Greg Young 首次提出。
在 CQRS 里:
- Command 是对系统的指令,表示“要改变什么”。它不返回数据,只返回成功/失败。
- Query 是读取请求,不会改变系统状态,也不会有 side effects。

CQRS 的核心是分离 command 与 query,使它们可以独立优化,这对分布式系统特别有价值。
CQRS with Event Sourcing
CQRS 常与 Event Sourcing 搭配。CQRS 使用独立的 read/write 数据模型,通常也在物理上分离存储。
使用 Event Sourcing 时,事件存储是 write model 的真实来源;read model 则通过 materialized views 提供查询能力,通常是高度 denormalized。
Advantages
- 读写负载可独立扩展
- 易于针对读/写做性能优化与架构演进
- 更贴合业务逻辑,耦合更低
- 查询端可避免复杂 joins
- 系统边界清晰
Disadvantages
- 应用设计更复杂
- 可能出现消息失败或重复
- eventual consistency 处理困难
- 系统维护成本增加
Use cases
- 读性能与写性能需要分别调优
- 系统持续演进,模型会有多个版本或频繁变更
- 与其他系统集成(特别是 event sourcing)时,单个子系统故障不应影响整体可用性
- 需要更严格的写安全,限制只有正确的 domain entities 执行写入