logo
Architecture Patterns

CQRS

读写分离模式

Command Query Responsibility Segregation (CQRS) 是一种架构模式,把系统操作分成 command 与 query。由 Greg Young 首次提出。

在 CQRS 里:

  • Command 是对系统的指令,表示“要改变什么”。它不返回数据,只返回成功/失败。
  • Query 是读取请求,不会改变系统状态,也不会有 side effects。

command-and-query-responsibility-segregation

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 执行写入

相关练习题

CQRS

暂无相关练习题