04.DDD与CQRS

news2024/11/26 2:55:31

学习视频来源: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.coloradmin.cn/o/2228450.html

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

相关文章

树莓派全网最全安装测试(包括系统,显示器,灯,舵机灯测试)

1.下载ubuntu https://cdimage.ubuntu.com/releases/20.04.5/release/ 2.格式化和烧录镜像源 3.修改自己的wifl sd卡直接放回树莓派 4.IP地址 https://www.bilibili.com/video/BV1YD421H7zF/?buvidXU5DB1750D0CD69E8D83AEE359EB6582A7396&is_story_h5false&midMJB9z…

LabVIEW涡扇发动机加力泵测试

LabVIEW软件开发的涡扇发动机加力泵测试平台采用高度集成的硬件设备,实现了对涡扇发动机加力泵的全面测试和分析,从而确保其性能满足严格的航空标准。 项目背景 涡扇发动机是现代飞机的重要动力来源之一,其加力泵的性能直接影响飞机的整体动…

车载中控系统的UI自动化测试实践

本文主要介绍了如何在车载中控系统中实施UI自动化测试的过程,从测试环境的准备到测试用例的设计,再到具体实现方法及注意事项等方面进行了详细的阐述。 引言 随着汽车行业的快速发展,车载中控系统已成为提升驾驶体验的重要组成部分。为了保…

echarts属性之dataZoom

dataZoom-slider 滑动条型数据区域缩放组件(dataZoomInside) 滑动条型数据区域缩放组件提供了数据缩略图显示,缩放,刷选,拖拽,点击快速定位等数据筛选的功能。下图显示了该组件可交互部分 所有属性 data…

牛客小白月赛103(打表、二进制、几何、思维)

文章目录 牛客小白月赛103(打表、二进制、几何、思维)A. 小冰的正多边形B. 冰冰的电子邮箱C. 冰冰的异或(打表、二进制)D. 冰冰的分界线(几何、浮点数处理)E. 冰冰的 GCD(调和级数、思维) 据说F是假题&…

「C/C++」C++17 之 std::variant 安全的联合体(变体)

#1024程序员节|征文# ✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计…

Web3的去中心化社交网络:区块链技术如何改变互动方式

随着互联网技术的不断进步,社交网络正在经历一场深刻的变革。Web3,作为新一代互联网技术的代表,正通过区块链和去中心化理念改变着我们与他人互动的方式。传统的社交网络通常由大型公司控制,用户数据的集中化管理和隐私问题备受关…

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上判断两个节点是否在…

HarmonyOS 5.0应用开发——文件读写

【高心星出品】 文章目录 文件读写文件操作创建目录删除目录或者文件扫描目录中文件 文本读写写入文本读取文本内容 文件读写文件写入边读边写 文件读写 Core File Kit(文件基础服务)为开发者提供一套访问和管理应用文件和用户文件的能力。帮助用户更高…

44-RK3588s调试 camera-engine-rkaiq(rkaiq_3A_server)

在RK3588s平台上调试imx415 camera sensor 过程中,已经识别到了camera sensor ID,并且可以拿到raw图和isp处理后的图像,但是isp处理后的图像偏绿,来看查看后台服务发现rkaiq_3A_server没有运行,然后单独运行rkaiq_3A_s…

Linux 宝塔安装(各操作系统命令合集)

由于CentOS官方已全面停止维护CentOS Linux项目,公告指出 CentOS 7和8在2024年6月30日停止技术服务支持,详情见CentOS官方公告。导致CentOS系统源已全面失效,比如安装宝塔等等会出现网络不可达等报错,需要切换源。系统源问题&…

Android 获取OAID

获取OAID 老规矩,直接上: implementation com.huawei.hms:opendevice:6.11.0.300 // 要获取华为vaid 和aaid,还需添加opendevice 依赖implementation(name: oaid_sdk_2.5.0, ext: aar) import android.content.Context; import android.util.…

基于微信小程序的公务员考试信息查询系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时,可以使用 field 来访问或设置…

可以在线制作的PS网页版来了!

在当今数字化的创意时代,设计领域不断发展与变革,设计师们对于工具的需求也日益多样化和高效化。随着互联网技术的飞速进步,一种全新的设计工具模式应运而生——在线制作的 PS 网页版。它以其独特的优势和便捷性,逐渐成为众多设计…

高德地图如何添加自己店铺的位置信息?

众所周知,创业开店时,地理位置的选择至关重要。一个优越的地理位置不仅能显著提升店铺的可见度,还能有效吸引更多潜在顾客的光顾。而且,为了将店铺的客流量最大化,商家还需在地图平台上准确标注自己的位置信息&#xf…

【黄豆颗粒数据集】黄豆识别 机器视觉 深度学习(含数据集)

一、背景意义 随着全球农业生产的现代化,黄豆(大豆)作为一种重要的经济作物,广泛用于食品、饲料和工业原料的生产。准确识别和分类黄豆颗粒对于农业生产的管理、质量控制和市场分析具有重要意义。然而,传统的人工分类方…

JavaEE-多线程上

文章目录 线程概述进程/线程多线程的作用JVM关于线程资源的规范关于Java程序的运行原理 并发与并行并发(concurrency)并行(parallellism)并发编程与并行编程 线程的调度策略分时调度模型抢占式调度模型 创建线程线程类分析入门实现线程的第一种方式实现线程的第二种方式 线程的…

论文阅读:三星-TinyClick

《Single-Turn Agent for Empowering GUI Automation》 赋能GUI自动化的单轮代理 摘要 我们介绍了一个用于图形用户界面(GUI)交互任务的单轮代理,使用了视觉语言模型Florence-2-Base。该代理的主要任务是识别与用户指令相对应的UI元素的屏幕…

Tomcat servlet response关于中文乱码的经验

前言 最近修改老项目项目,使用zuul网关返回的中文内容乱码了,如果使用GBK或者GB2312编码确正常显示,稍微实验了一下,发现里面很多细节,毕竟Springboot对我们做了很多事情,而且当我们使用不同的模式会出现很…