CQRS(命令查询责任分离)是一种奇特的模式,表示解耦系统的输入和输出。

通常情况下,输入端将数据写到数据库,输出端从数据库查询。与读写锁的场景类似,写的过程中不能读。正常情况下没有问题,但是在大规模、高吞吐量和需要对事件进行复杂处理的情况下,每当输入事件来临,读取操作就要等待,是非常致命的。

CQRS的目的就是解决这一类问题的,以下摘自《Go:构建基于Go和React的云原生Web应用与微服务》,如图:


我们将接收到的刺激称为command,将读取操作成为query。整个流程如下:

1.一些外部刺激调用命令处理程序(CommandHandler);

2.命令处理程序负责创建事件(Event);

3.事件被存储在事件存储器(Event Store)中;

4.事件处理器(Event Processor)可以响应接收的入站事件,并且进行必要的聚合和计算,以便创建发往查询处理程序的新数据;

这些数据本身就是为特定查询量身定制的,本质上是一个通过事件计算出的现实,可用于具体的查询。这不是临时缓存,而是持久化的视图(View)或存储库(Store)。

5.当请求进入查询处理程序时,它们会向View Store发起及其快速和简单的请求。许多情况下,在View Store和查询处理程序之间可能存在一个缓存层,用来进一步加快查询响应的速度。

CQRS粗浅理解的更多相关文章

  1. paxos算法之粗浅理解

    paxos出身 paxos出身名门,它爹是没多久前获得图灵奖的在分布式领域大名鼎鼎的LeslieLamport. paxos为何而生 那么Lamport他老人家为什么要搞这个东东呢,不是吃饱了撑的,而 ...

  2. 对js闭包的粗浅理解

    只能是粗浅的,毕竟js用法太灵活. 首先抛概念:闭包(closure)是函数对象与变量作用域链在某种形式上的关联,是一种对变量的获取机制.这样写鬼能看懂. 所以要大致搞清三个东西:函数对象(funct ...

  3. C#高级编程笔记 Delegate 的粗浅理解 2016年9月 13日

    Delegate [重中之重] 委托 定义一:(参考)http://www.cnblogs.com/zhangchenliang/archive/2012/09/19/2694430.html 完全可 ...

  4. 对Java框架spring、hibernate、Struts的粗浅理解

    对 Struts 的理解:1. struts 是一个按 MVC 模式设计的 Web 层框架,其实它就是一个大大的 servlet,这个Servlet 名为 ActionServlet,或是 Actio ...

  5. UNITY 画布的粗浅理解

    画布:当画布是screen-space overlay时,这个好理解,画布可以控制如分辨率,层次等.但当画布是 world-space时,这个严格来说就不算是一个画布了,屏幕空间或相机空间的画布是先绘 ...

  6. 关于</div>的粗浅理解

    </div>作为c#中常用的一个标签,在写多个区域的内容时有着十分重要的作用.如果写简单的网页时不用div可能感受不到太大的影响,但是在写较为复杂的程序时div的分隔作用就很明显了,改动大 ...

  7. function的粗浅理解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 关于JavaScript闭包的粗浅理解

    在JavaScript中,使用var创建变量,会创建全局变量或局部变量. 只有在非函数内创建的变量,才是全局变量,该变量可以在任何地方被读取. 而在函数内创建变量时,只有在函数内部才可读取.在函数外部 ...

  9. Fragment的粗浅理解

    Fragment: 1.它是对于Activity界面实现的一种途径,相对于已经绑定的Layout,他更轻便,更灵活,更具有自由度和可设计性. 2.Fragment的功能正如他的正文意思所言,他是一个片 ...

随机推荐

  1. java中存储mysql数据库时间类型

    Mysql 与 java 的时间类型 MySql的时间类型有 Java中与之对应的时间类型   date                 java.sql.Date   Datetime        ...

  2. 最新QT4.8+kernel_3.2.5+uboot_2010.06+tslib移植成功-问题小结

    2012-02-19 21:34:13 都是从源码下载然后自己修改,使用与TQ2440,之前uboot其实已经完成了.但是yaffs2没带起来.现在回头看来是很简单的了.bootargs参数中我设置成 ...

  3. CCF CSP 201604-1 折点计数

    题目链接:http://118.190.20.162/view.page?gpid=T42 问题描述 试题编号: 201604-1 试题名称: 折点计数 时间限制: 1.0s 内存限制: 256.0M ...

  4. 练手——用Python写的时间戳转换为北京时间的小工具

    #北京时间需加上8小时bj = 8*3600 def time_stamp(times):    #一天总秒数    nonDaySeconds = 24*3600    leapmonths = [ ...

  5. 自娱自乐RN版小说APP历程记录

    当前rn版本 "react": "16.6.3" "react-native": "0.58.5" 通过react-na ...

  6. HashMap的hash原理

    public static void main(String[] args) { String[] keyArray = {"Terra", "Jonas", ...

  7. Gradle构建多模块项目

    通常我在使用Maven构建项目的时候是将应用项目划分为多个更小的模块. Gradle 项目也拥有多于一个组件,我们也将其称之为多项目构建(multi-project build). 我们首先创建一个多 ...

  8. 复旦大学2017--2018学年第二学期(17级)高等代数II期末考试第六大题解答

    六.(本题10分)   设 $A$ 为 $n$ 阶幂零阵 (即存在正整数 $k$, 使得 $A^k=0$), 证明: $e^A$ 与 $I_n+A$ 相似. 证明  由 $A$ 是幂零阵可知, $A$ ...

  9. Git 帮助

    Git 配置 配置 git config --global user.name "..." git config --global user.email "...&quo ...

  10. TP5创建动态数据表

    $sql = " CREATE TABLE IF NOT EXISTS `$table_name` (`id` int(11) unsigned NOT NULL AUTO_INCREMEN ...