首页 > 数据库 >从数据库读写分离到CQRS

从数据库读写分离到CQRS

时间:2024-01-10 17:36:08浏览次数:35  
标签:模型 读写 分离 查询 CQRS 数据库

1. 数据库读写分离

对于数据库的操作就四种:CRUD

我们把这四种操作,又划分为两类,读和写

 

当我们的系统并发量高的时候,自然会考虑到提高数据库性能,数据库读写分离,

 但是,实际测试下来,总是有各种不满意的地方。其中最麻烦的就是各种复杂查询的性能,写库有单点故障问题

2. CQRS

有了数据库层面的”归纳“:CRUD->读、写, 可以继续”归纳“CRUD->读、写 --> 查询、命令

将查询和命令分开,也就是我们要说的CQRS(Command Query Responsibility Segregation)模型,命令与查询职责分离

这样,我们在应用层面就可以抽象成如下模型:

 乍一看,这套东西其实和采用的数据库的读写分离是一样的,就是把读写给分开,但是这些并没有那么简单

其实是模型的不同,原来的数据库读写分离确实把读写的这两个行为分开了,但是它依然有一个重要的事情没有做,那就是职责的分开

 

什么叫职责的分开呢?就是读写双方不要搞同一套模型。而数据库读写分离的问题就在这里,它使用了同一个模型。

使用同一个模型在这里造成的问题是,这个模型由于既要考虑读取数据不能太困难,也要考虑写入数据不能太困难。

使用 CQRS 思想的话,写入不需要关心读取的问题,读取数据也不用关心写入的问题,那就可以做到真正的读写分离,提高性能

写存储可以用MySQL这样的关系型数据库,而查询存储则可以使用Elasticsearch作为存储。命令-查询职责分离(CQRS)模式是一种应用于这种场景的通用模型,它显式地将系统中的读(查询)和写(命令)进行分离

优点

1. 拆分了这两块的代码,使各自可以采用不同的技术栈,做针对性的调优。命令模型负责数据的变更,并把最新数据同步给查询模型。

2. 切分了流量,能够更灵活的做资源分配,处理数据逻辑的时候,查询模型根据自己的想法来安排数据,想怎么用就怎么用

缺点:

1. 引入 CQRS 的模式后,最大的问题在于引入了过度的复杂性, 由于需要读和写分开,那么我们开发的工作量无形中被加大了一倍。又引入 CQRS,这变得更复杂了, 查询想要更好的性能可能就得考虑开源的搜索引擎中间件。每引入一种都会增加开发成本、服务器成本,以及更多的复杂度

2. 最终一致性:如果分离读取和写入数据库,读取数据可能会过时

  a. 如果我们采用了CQRS模式,但是命令和查询两侧底层所依赖的数据模型并未分离,而是基于共享的数据存储和数据模型,命令和查询之间不需要额外的交互,命令侧的数据更新对查询侧实时可见。在这种架构模式下,两侧基于共享的数据已经天然的集成在一起,不需要额外机制进行通信,自然也无需引入消息了。

  b. 如果我们采用CQRS模式,并且命令和查询两侧进行了数据模型的分离,二者各自依赖独立的数据模型。同时,数据存储也分开部署。命令侧负责数据的更新,而查询侧只负责数据的查询,如何将数据的更新及时同步到查询侧是需要解决的问题。在这种架构模式下,使用消息模式作为两侧的通信机制是个不错的选择

 3 种主要的 CQRS 架构

1. 单数据库 CQRS

顾名思义就是command和query都是操作的同一个数据库

 2. 双数据库 CQRS

在“双数据库”方式中,我们需要两个数据库,一个用于写操作,一个用于读操作。命令端使用针对写操作优化的数据库。查询端使用针对读取操作优化的数据库

命令每改变一个状态,修改后的数据就必须从写数据库推送到读数据库中,或者作为一个跨两个数据库的分布式事务,或者使用最终一致性模型。 这种架构给软件的查询端带来了数量级的性能提升,这是有利的,因为一般系统在读数据上花费的时间一般比写数据要更多,但是要解决数据一致性问题

 3. 事件源 (EventSourcing) CQRS

最复杂的 CQRS 架构。与前面两种方式相比,事件源存储数据的思路完全不同。在事件源方法中,我们并不只存储实体的当前状态,而且将实体发生的每一个状态作为快照来存储。实体并不是以标准化数据的形式保存,而是通过事件的时间戳来保存它们的变更。

(可以参考Mysql的Binlog设计)这种记录的优点是可以根据回放,重现每一次状态变更的时间点以及变更轨迹。而查询则可以根据当前状态的快照来为查询提速

 

标签:模型,读写,分离,查询,CQRS,数据库
From: https://www.cnblogs.com/Mr-shen/p/17956963

相关文章

  • flowable适配人大金仓Kingbase数据库
    背景因为国产化的需求,需要把现有项目的数据库改成人大金仓,适配某个项目的时候因为使用了没适配Kingbase的flowable,导致无法启动。原本使用的是Oracle数据库,kingbase兼容Oracle数据库,可以直接当成Oracle来使用。错误1:couldn'tdeductdatabasetypefromdatabaseproductnam......
  • 悦数图数据库助力电信运营商宽带业务提效
    随着5G和万物互联时代的到来,家庭和企业对宽带的需求持续增长,同时,基础设施的完善和运营商支持的网络设备规模的扩大使得网络拓扑更加复杂。因此,如何提高宽带业务处理的效率,以及如何有效地规划从终端和末端设备到机房设备的最优路径,成为了运营商宽带业务持续扩展亟需解决的瓶颈。01......
  • ArcNeural: AI 时代的多模数据库丨技术专栏
    导读 本文根据Fabarta资深技术专家谭宇在“2023中国软件技术大会”演讲实录整理而来。围绕以下四个方面进行介绍:首先简单介绍Fabarta背景以及我们为什么要研发ArcNeural;其次深入介绍ArcNeural的架构与实现;三是介绍围绕ArcNeural我们如何构建AI应用;最后进行总结与展望......
  • 达梦7数据库安装手册
    第1章安装简介达梦数据库管理系统(以下简称DM)是基于客户/服务器方式的数据库管理系统,可以安装在多种计算机操作系统平台上,典型的操作系统有:Windows(Windows2000/2003/XP/Vista/7/8/10/Server等)、Linux、HP-UNIX、Solaris、FreeBSD和AIX......
  • 6 修改表 -- MySQL数据库
    在大多数情况下,表结构更改时都使用altertable语句。1.修改表类型#语法mysql>altertable表名modify[column]列定义[first|after列名];实例:修改表emp的ename字段,将varchar(10)改为将varchar(20)mysql>altertableempmodifyenamevarchar(20);2.......
  • 数据库_DuckDB_数据库应用示例
    通用的问题数据库存储的位置在那里;数据库的所有者是谁;其它用户如何来访问这个数据库;duckdbDuckDB是阿姆斯特丹CentrumWiskunde&Informatica(CWI)数学和理论计算研究中心的学者们的创意,它嵌入在一个主机进程中。无需安装、更新或维护DBMS服务器软件程序DuckDB......
  • 缓存数据库双写不一致
    缓存数据库双写不一致Redis缓存与数据库Mysql双写不一致如何解决?方案2应该是最好的,也是最复杂的。其他都有很明显的问题。对于频繁更新的数据不建议加缓存异步更新缓存(基于订阅binlog的同步机制):binlog增量订阅消费+消息队列+增量数据更新到redis读Redis:热数......
  • N天爆肝数据库——MySQL(3)
    (N天爆肝数据库——MySQL(3))本篇文章,主要对DCL、函数、约束和多表查询进行知识总结和学习。期待和大家一起学习进步。DCLDCL-介绍数据控制语言,用来管理数据库用户、控制数据库的访问权限。DCL-管理用户查询用户USEmysql;SELECT*FROMuser;创建用户CREATEUSER......
  • stm32 CubeMx 怎么实现SD卡/sd nand FATFS读写测试
    本实验仅用于记录和分享技术经验若涉及侵权请联系我删除。stm32CubeMx实现SD卡/sdnandFATFS读写测试。材料:stm32F407ZGT6开发板、雷龙公司的SD_NAND测试板(CSNP1GCR01-AOW)。(一开始是使用Nandflash的操作起来不太方便而且stm32cubemx自带的fatfs还没有磨损平衡算......
  • openGauss学习笔记-191 openGauss 数据库运维-常见故障定位案例-出现Error:No space l
    openGauss学习笔记-191openGauss数据库运维-常见故障定位案例-出现Error:Nospaceleftondevice提示191.1出现“Error:Nospaceleftondevice”提示191.1.1问题现象在数据库使用过程中,出现如下错误提示。Error:Nospaceleftondevice191.1.2原因分析磁盘空间不足......