对CQRS涉及架构的简单学习笔记
对CQRS涉及架构的简单学习笔记
一. CQRS的基础Event Sourcing
了解CQRS涉设计模式之前,需要先了解Event Sourceing的思想。
- Event Sourceing是通过每一个原子事件来记录发展流向(改变),同时对每一个事件都记录下来,而不是只关心最终结果。
- 事件对象是自己响应,并更新自身状态,过程中不断持久化各阶段。
- 利用空对象和上述的持久化过程,能够快速恢复数据和业务流程。
- 事件不可修改的属性,有效避免了并发的问题。事件只有不断的新增。
CQRS其实就是在vent Sourcing的基础之上,分离出读写和视图。
二. CQRS作为DDD的一种解决档案
由于传统的分层模型无法较好满足DDD(设计过于复杂),因此诞生了CQRS模型。
//最为简单的一个DDD模型
//单一数据源导致设计过程中偏向于数据模型而不是行为模型、设计阶段都基于数据库结构设计
var acc = new Account();
var acc2 = new Account();
acc.Balance+=10;acc2.Balance-=10;
//贫血模型
public class Account {
public decimal Balance
{
get;
set;
}
}
CQRS代表“Command Query Responsibility Segregation”,也就是我们常说的读写隔离,这意味着你应该将读写分成应用程序的两个不同部分。分别为command和query
query:
- 保存事件的最终状态
- 直接调用读取查询视图(类似于缓存)
- 在写的过程中引入多个service层,但时每个service职责单一
- 命令处理程序唯一做的就是接受命令并找到正确的实体(或者如果我们用DDD的术语叫做aggregate聚合)以应用命令。
- 事件处理程序仅负责将更改应用于数据库。
命令发布到同一个队列,同一个队列总是被一台固定的机器消费,保证消息的顺序以及并发过程中数据的一致性。
三. CQRS优缺点
优点:
- 读写分离提高了系统的可用性。
- 事件机制,能提高系统的可用性,可以有效避免雪崩事件。通过中间件解耦,也提高了扩展性。
- 相比较接口直接调用,利用中间件的方式可以提高数据传输的可靠性。
- 记录过程日志,可以还原数据各阶段状态(保证代码逻辑的向前兼容)
缺点: - 大数据量的存储和查询
- 数据库的数据订正较难产生效果
四. 使用场景
- 当我们的应用的写模型和读模型差别比较大时;
- 当我们希望实践DDD时;因为CQRS架构可以让我们实现领域模型不受任何ORM框架带来的对象和数据库的(O/R)阻抗失衡的影响;
- 当我们希望对系统的查询性能和写入性能分开进行优化时,尤其是读/写比非常高的系统,CQ分离是必须的;
- 希望我们的系统同时满足高并发的写、高并发的读的时候;因为CQRS架构可以做到C端最大化的写,Q端非常方便的提供可扩展的读模型;
参考目录:
https://www.imooc.com/article/40858
https://blog.csdn.net/quguang65265/article/details/93596884
https://www.cnblogs.com/netfocus/p/4150084.html

浙公网安备 33010602011771号