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和查询处理程序之间可能存在一个缓存层,用来进一步加快查询响应的速度。