CQRS (Command Query Responsibility Segregation) 命令查询职责分离模式,在谈论这个之前必须要先谈论OO(Object-Oriented)里面的CQS(Command Query Separation)因为两者的概念一样,只是应用层级不太一样。
CQS 使用於写程序层级,将Object主要分为两种动作command、Query:
举个例子:
function Array() {
this.arr = []
}
// Insert 属於 "Command" 因为所执行的事情是将element 存入 arr 中,改变了状态
Array.prototype.Insert = function (element) {
this.arr.push(element)
}
// Read 属於 "Query" 因为只是读取并未改变Array 整个物件的状态
Array.prototype.Read = function (index) {
return this.arr[index]
}
其中CQS 有一个特性,
会改变状态的方法不会回应物件状态,反之不会改变状态的回应物件状态
。换句话说Command 因为是改变状态的动作,则会不会有Return ; Query 则会有Return。
也别於CQS,CQRS 则是将 Command、Query的概念拉到系统层级,以资料库中Create, Read, Update, Delete (CRUD) 四个动作为例,大多时候Read才是大量被使用的。而使用CQRS 就能够轻易的增加Read 用的服务器,为此增加弹性,并且能够轻易的做出针对性的效能教调。
举个例子:
如果将资料库的存取拆分成Command、Query,资料库的选择上会有一些变化,如Command 换成写入较快的,Query 则换成读取较快的。透过资料库本身的Master-slaves 模式就可以进而提昇效能。如下示意图。
master-slave pattern 指的是主动或者被动的方式将资料同步到其他资料库;
[1] https://martinfowler.com/bliki/CQRS.html
[2] https://martinfowler.com/bliki/CommandQuerySeparation.html
WebRTC 在实作上遇到蛮多难题的,想要转成文章,理解程度仍然不足,只能花更多时间来研究了,不确定...
前言: 今天来介绍如何创建使用 CameraX 来显示预览 大纲 : build.gradle(ap...
Spring-assisted knives also called assisted openin...
前言 接下来算是小聊一下 Python 的 Class 语法而已,算是稍微休息一下,所以这边简单聊就...
前言 使用numpy及matplotlib函式库实作直方图。 程序 import numpy as ...