命令查询职责分离模式|命令查询职责分离模式 Command and Query Responsibility Segregation (CQRS) Pattern
非常著名的设计模式, 把数据读取和数据写入过程相分离, 来拉升整个系统的性能. 同时也能避免多线程update时的冲突
问题
一般我们做数据统计, 面对的就是一个类似excel的表格, 我们从中读取数据或者向内写回数据.
在经典设计模式下, 通过Database access Level读出来一些数据, 组装成Data Transfer Object,
我们可以对这些DTO进行修改, 然后再刷回数据库
文章图片
【命令查询职责分离模式|命令查询职责分离模式 Command and Query Responsibility Segregation (CQRS) Pattern】这种CRUD的操作的问题也很容易理解
高一致性的代价是多线程下加锁性能不高
解决
文章图片
image.png 读写分离了解一下, 其余的不再阐述了.基于读写分离的一致性问题是获得性能的代价.
决策
- 业务是否允许幻读, 如果不允许的话, 是否能通过一些标志位让业务层知道自己读的这一条高概率幻读了. 需要刷新(订票网站通常用的模式, 实际上飞机票是超额发票等退票或者自动升舱的. 这是一个基于排队论的业务问题而不是设计模式问题)
- 这种模式下带来的成本能否接受. Mysql读写分离意味着数据可能存了两份, 而read on snapshot的模式意味着为了读操作按照时间窗口不断生成snapshot
- 如果读进程是在客户端的, 服务端是否在updat后主动去通知客户端用最新的数据呈现给用户以减少幻读的影响范围
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- mybatisplus|mybatisplus where QueryWrapper加括号嵌套查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- 你命令我爱你吧(原创)
- 数据库|SQL行转列方式优化查询性能实践
- 常用git命令总结
- neo4j|neo4j cql语句 快速查询手册
- 用Go构建区块链——3.持久化和命令行
- 《读_Head_First_有感》_“命令模式”