《系统设计》课程学习笔记—命令和查询责任分离(CQRS)

178 阅读2分钟

命令查询责任分离(CQRS)是一种架构模式,它将系统的操作划分为命令和查询。它首先由 Greg Young 提出。

在CQRS中,命令是执行特定任务的指令。它是一种改变某事物的意图,不返回值,只返回成功或失败的标志。而查询是对不改变系统状态或不引起任何副作用的信息的请求。

command-and-query-responsibility-segregation.webp

CQRS的核心原则是命令和查询的分离。它们在一个系统中执行完全不同的角色,将它们分离意味着可以根据需要对每个角色进行优化,分布式系统可以利用这一点。

具有事件源的CQRS

CQRS 模式通常与事件源模式一起使用。基于 CQRS 的系统使用单独的读写数据模型,每个数据模型都适用于特定任务,通常位于物理独立的存储中。

当与事件源模式一起使用时,事件的存储是写模型,是信息的正式来源。基于CQRS的系统的读取模型提供数据的物化视图(Materialized Views),通常为高度非规范化视图。

优点

让我们看一下 CQRS 的一些优点:

  • 允许独立扩展读写的工作负载。
  • 更容易扩展、优化和更改架构。
  • 更接近松散耦合的业务逻辑。
  • 应用程序在查询时可以避免复杂的连接。
  • 系统行为之间有清晰的界限。

缺点

以下是 CQRS 的一些缺点:

  • 更复杂的应用程序设计。
  • 可能出现消息失败或重复消息。
  • 处理最终一致性是一个挑战。
  • 增加了系统维护工作。

使用场景

以下是适合使用 CQRS 的一些场景:

  • 数据读取的性能必须与数据写入的性能分开进行微调。
  • 该系统预计会随着时间的推移而发展,可能包含模型的多个版本,或者业务规则定期变化。
  • 与其他系统的集成,尤其是与事件源相结合,其中一个子系统的暂时故障不应影响其他子系统的可用性。
  • 更好的安全性,以确保只有正确的域实体对数据执行写入。