04.DDD与CQRS

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid=1940048&ctype=0

文章目录

  • 定义
  • 职责分离
  • DDD与CQRS的关系
  • 领域模型和查询模型特点
    • 命令场景的领域模型
    • 查询场景的查询模型
  • 架构方案
    • 领域事件
    • 方案1:标准架构
    • 方案2:同事务存储分离
    • 方案3:共享存储
  • 什么时候采用CQRS
  • 采用CQRS的哪种架构方案

定义

CQRS全称Command Query Responsibility Segregation,即命令和查询职责分离。它的设计理念来源于单一职责原则。软件系统功能拆解成命令和查询两类:

  • 命令:有副作用,会导致系统发生变更。
  • 查询:无副作用,不会导致系统发生变更。

职责分离

在架构上,把命令和查询两类功能代码分离, 分为命令模块和代码模块。

  • 一般查询模块依赖命令模块。
  • 查询模块负责生成查询类数据。比如组装一些数据,放到查询数据库里,注意这里是会往数据库里写数据的,查询模块不全是读操作。
  • 查询模块和命令模块的数据在存储上可以共享,也可以分离,甚至异构。共享:比如用同一张表,命令模块用其中的几个字段,查询模块用其中的几个字段。分离:命令模块用一个数据库或表,查询模块用另外一个数据库或表。异构:比如命令模块用关系型数据库,查询模块用非关系型数据库,文档数据库
  • 这样架构的主要目的是应对高性能查询和复杂查询。
  • 不使用DDD可以使用CQRS。CQRS作为一种架构模式,并不一定要给DDD用,DDD可以使用CQRS作为一种架构方案。

DDD与CQRS的关系

DDD可以使用CQRS作为它的一种架构实现。命令模块用DDD实现,查询模块不用DDD实现。 为什么要这样做呢?因为这样做可以降低领域模型设计难度,不然同时适配命令和查询两类业务的领域模型非常难以设计。

领域模型和查询模型特点

命令场景的领域模型

  • 对象少
  • 对象建形成树形或图结构
  • 避免冗余数据
  • ACID很重要

查询场景的查询模型

  • 对象多。如批量查询,查询最近一周的订单
  • 对象间只有查询用的关联关系。如取商品数据、交易数据,组装成购买记录
  • 大量冗余,为了提升性能。同一份数据可以在这个模型存一份,在那个模型也存一份。为的就是查询方便提高性能。或者有一些过滤条件,需要把这些条件字段也存下来,作为索引,提高查询性能。
  • ACID不重要

架构方案

领域事件

领域事件是一种领域模型,代表领域中已发生的确定的有意义事件,明确表示发生了什么事情,有意义,有人关注。它不可变,且按时间有序。

方案1:标准架构

在这里插入图片描述
在这里插入图片描述

保证消息的可靠送达,有且只有一次,不能重复消费,也不能不消费。发送事件和插入事件日志在同一个事务内,保证原子性。等到事务提交之后,才会触发事件发送。从数据库中取出事件日志,向MQ发消息,如果发送成功,会标记为已发送。如果发送失败了,会有定时任务补偿。

方案2:同事务存储分离

在这里插入图片描述
这里的存储分离指用同一个数据库不同表。如果用的是不同的数据库,那就会出现分布式事务的问题,这样就和方案1没有太大差别。

方案3:共享存储

在这里插入图片描述
在这里,已经抛弃领域事件了,同事务同表。当把命令模型持久化的时候,同时也把查询模型创建出来。

什么时候采用CQRS

不用CQRS就会污染领域模型的时候
复杂查询

  • 条件复杂,需要冗余数据
  • 搜索

高性能查询

  • 需要查询专用数据库。比如查询用的数据库有更好性能
  • 异构查询存储(关系数据库+缓存+NoSql)

只要领域复杂点,一般都需要CQRS!

采用CQRS的哪种架构方案

  • 同事务同表
  • 同事务不同表
  • 消息集成不同数据库

从简单做起,能落地能解决问题最重要! 一开始用同事务同表,这种最简单。随便场景越来越复杂,用共享的存储不能解决问题了,那就需要用同事务不同表。或者需要异构数据库存储,就要用消息集成不同设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业140+总分410+武汉大学807信号与系统考研经验武大原936电子信息与通信工程,真题,大纲,参考书。

考研专业课807信号与系统(原936)140,总分410,顺利被武汉大学录取,群 里不少同学希望总结一下复习经验,回看这一年有得有失,总结一下希望给大家有些参考。考研还需从自身情况出发,制定适合自己的复习计划&am…

eclipse下载与安装(汉化教程)超详细

目录 一、下载eclipse安装包 三、配置eclipse 代码自动补全功能 安装汉化包 中英文切换 四、用eclipse写hello world 一、下载eclipse安装包 1、首先进入 eclipse官网 如下: 2、这里面有很多版本;我们小白一般选择第二个,向下滑动&…

【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)

文章目录 一、安装1、解压2、修改字符集3、启动 二、实战1、将hive数据导入mysql2、将mysql数据导入到hive 一、安装 Kettle的安装包在文章结尾 1、解压 在windows中解压到一个非中文路径下 2、修改字符集 修改 spoon.bat 文件 "-Dfile.encodingUTF-8"3、启动…

RHCE笔记-DNS服务器

一.DNS简介 DNS(域名系统)是一种互联网服务,负责将我们熟悉的域名(比如 www.example.com)转换为计算机能理解的IP地址(比如 192.0.2.1)。这样,当你在浏览器中输入网址时,…

利用QGIS工具手动绘制线轨迹并生成地理信息geojson文件

前端想要获得一个完整的shp文件或者geojson的地理信息文件,可以利用QGIS工具手动绘制你想要的数据点位,然后导出图层生成对应的文件即可。 1、新建临时图层 选择线图层,点击ok创建临时图层。 2、绘制线图层 在工具栏中选择添加线要素&#…

面试记录(1)

java中的抽象类和接口的区别: 相同点 (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 不同点 1.关键字不同: ​ ① 继承抽象类的关键字是extends,而实现接口的关键字是implements;…

构建您自己的 RAG 应用程序:使用 Ollama、Python 和 ChromaDB 在本地设置 LLM 的分步指南

在数据隐私至关重要的时代,建立自己的本地语言模型 (LLM) 为公司和个人都提供了至关重要的解决方案。本教程旨在指导您完成使用 Ollama、Python 3 和 ChromaDB 创建自定义聊天机器人的过程,所有这些机器人都托管在您的系统本地。以…

聊聊Web3D 发展趋势

随着 Web 技术的不断演进,Web3D 正逐渐成为各行业数字化的重要方向。Web3D 是指在网页中展示 3D 内容的技术集合。近年来,由于 WebGL、WebGPU 等技术的发展,3D 内容已经能够直接在浏览器中渲染,为用户提供更加沉浸、互动的体验。以…

电科金仓(人大金仓)更新授权文件(致命错误: XX000: License file expired.)

问题:电科金仓(人大金仓)数据库链接异常,重启失败,查看日志如下: 致命错误: XX000: License file expired. 位置: PostmasterMain, postmaster.c:725 解决方法: 一、下载授权文件 根据安装版本在官网下载授权文件(电科金仓-成为世界卓越的数据库产品与服务提供商)…

uniapp的video视频属性打包app后层级过高

问题:在使用uniapp开发APP时,使用video标签显示视频发现H5可以正常展示,但是打包到APP后,它的层级过高,把底部导航都盖住了。 官网说明:uni-app官网 官网给了cover-view组件或plus.nativeObj.view、subNVue…

考研资料分享系统的设计与实现(lw+演示+源码+运行)

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全…

[perl] 数组与哈希

数组变量以 符号开始,元素放在括号内 简单举例如下 #!/usr/bin/perl names ("a1", "a2", "a3");print "\$names[0] $names[0]\n"; print "size: ",scalar names,"\n";$new_names shift(names); …

项目符合行业安全标准的必要步骤与实用建议

要保障项目符合行业安全标准,关键在于建立全面的安全管理体系、定期进行风险评估、持续培训员工,以及确保合规性文件和审核流程完整。例如,通过建立合规文件和审核流程,可以系统性地跟踪项目的安全实践和合规性,使安全…

小米15和小米15 Pro区别没那么大,但也得看准再下手

小米15和小米15 Pro区别大总结 接下来,我们将从关键差别等多个方面来分析两个机型的具体区别(Ps:只聊不一样的,没提到就是一样的): 关键差别 • 屏幕素质:小米15采用的是6.36英寸1.5K&#xf…

【科研绘图】3DMAX管状图表生成插件TubeChart使用方法

3DMAX管状图表生成插件TubeChart,一款用于制作3D管状图表的工具。可以自定义切片的数量以及随机或指定切片颜色。 【版本要求】 3dMax 2008及更高版本 【安装方法】 TubeChart插件无需安装,使用时直接拖动插件脚本文件到3dMax视口中打开即可&#xff0…

力扣hot100-->递归/回溯

目录 递归/回溯 1. 17. 电话号码的字母组合 2. 22. 括号生成 3. 39. 组合总和 4. 46. 全排列 5. 78. 子集 递归/回溯 1. 17. 电话号码的字母组合 中等 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到…

服务器端请求微信登陆授权接口一直超时问题

环境: 服务器系统:centos 7.2 站点环境:nginx 遇到问题: 1、微信小程序端请求服务器登陆接口,服务端收到请求后向微信接口服务器请求数据,请求成功后返回数据给客户端,但是请求微信接口服务器经…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储

随着云计算技术的日益成熟,越来越多的企业开始将其业务迁移到云端,以享受更为灵活、高效且经济的服务模式。在视频监控领域,云存储因其强大的数据处理能力和弹性扩展性,成为视频数据存储的理想选择。NVR批量管理软件/平台EasyNVR&…

基于PHP的http字段查询与注册(V1)(持续迭代)

目录 版本说明: 实现环境(WAMP): 数据库链接 查询页面 php处理逻辑 字段添加 版本说明: 该查询功能以查询http首部字段为目的实现的字段属性、字段内容的查询,以及对新字段信息的数据注册。 v1实现…

【面试经典150】day 9

目录 1.Z 字形变换 2.找出字符串中第一个匹配项的下标 3.文本左右对齐 1.Z 字形变换 class Solution {public String convert(String s, int numRows) {//明明是N字形变换if(numRows<2) return s;//rows是可扩展的字符串数组List<StringBuilder>rowsnew ArrayLi…