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的哪种架构方案

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【运动的&高尔夫球】高尔夫球检测系统源码&数据集全套:改进yolo11-CA-HSFPN

改进yolo11-HWD等200全套创新点大全:高尔夫球检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.30 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可…

【python】flash-attn安装

这个命令: 确保使用正确的 CUDA 12.6 工具链 设置必要的 CUDA 环境变量 包含了常见的 GPU 架构支持 利用你的128核心进行并行编译 # 清理之前的安装 proxychains4 pip uninstall -y flash-attn# 获取 CUDA 路径 CUDA_PATH$(dirname $(dirname $(which nvcc)))# 使用…

得计算题者得天下!软考系统集成计算题详解!

软考中级系统集成项目管理工程师考试一共有《综合知识》和《案例分析》两门科目,而在这两科中都会涉及到计算题,特别是案例分析中,计算题每次考试都会占到一道大题,共25分,占到了科目总分的1/4,所以对于系统…

第2章 Android App开发基础

第 2 章 Android App开发基础 bilibili学习地址 github代码地址 本章介绍基于Android系统的App开发常识,包括以下几个方面:App开发与其他软件开发有什么不一 样,App工程是怎样的组织结构又是怎样配置的,App开发的前后端分离设计…

腾讯云视频文件上传云存储时自动将mp4格式转码成m3u8

针对问题: 弱网环境下或手机网络播放mp4格式视频卡顿。 存储环境:腾讯云对象存储。 处理流程: 1:登录腾讯云控制台,进入对象存储服务,找到对应的存储桶,点击进入。 在任务与工作流选项卡中找…

如何下载安装TestLink?

一、下载TestLink、XAMPP TestLink 下载 |SourceForge.net 备用:GitHub - TestLinkOpenSourceTRMS/testlink-code: TestLink开源测试和需求管理系统 下载XAMPP: Download XAMPP 注意:TestLink与PHP版本有关系,所以XA…

【AI学习】扩散模型的一点思考:生成过程为什么要增加噪声项

前面学习了扩散模型,并做了总结PPT。 其中有一个疑问:在生成过程中,就是下图的算法2中的第四步,为什么要在预测了噪声项后,Xt减去预测的噪声后,还有再叠加一个噪声项?就是增加的部分。 李宏毅…

Halcon 多相机统一坐标系(标定)

多相机统一坐标系是指将多个不同位置的相机的图像采集到同一个坐标系下进行处理和分析的方法。 在计算机视觉和机器视觉领域中,多相机统一坐标系被广泛应用于三维重建、立体视觉、目标跟踪等任务中。 以gen_binocular_rectification_map(生成描述图像映…

访问jenkins页面报错

安装fontconfig 即可 yum install fontconfig -y 安装完之后重启jenkins systemctl restart jenkins 再访问

安卓13 连接usb设备后不更新ui

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码更改4.彩蛋1.前言 有些界面在链接usb设备后,ui会被刷新,导致闪烁问题。 2.问题分析 像这种问题一般是usb事件,导致的ui事件更新了,处理方法是禁止该事件 3.代码更改 这块我们就需要在输入事件管理里面…

从变量的角度理解 Hooks , 变得更简单了

从变量角度理解Hooks 在React的世界里,Hooks的引入为函数式组件带来了前所未有的灵活性和能力。它们让我们得以完全摆脱class式的写法,在函数式组件中完成生命周期管理、状态管理、逻辑复用等几乎全部组件开发工作。这次,我们就从变量的角度…

【面试经典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…

sudo apt install jupyter-notebook安装notebook失败E: Aborting install.

问题&#xff1a; sudo apt install jupyter-notebook安装notebook失败E: Aborting install. ~/jie/mywork/PointNetCFD$ sudo apt install jupyter-notebook --fix-missing Reading package lists... Done Building dependency tree Reading state information... Do…

软件工程实践项目:人事管理系统

一、项目的需求说明 通过移动设备登录app提供简单、方便的操作。根据公司原来的考勤管理制度&#xff0c;为公司不同管理层次提供相应的权限功能。通过app上面的各种标准操作&#xff0c;考勤管理无纸化的实现&#xff0c;使公司的考勤管理更加科学规范&#xff0c;从而节省考…

AI与低代码的碰撞:企业数字化转型的新引擎

引言 在当今的商业环境中&#xff0c;企业数字化转型已从选择题变成了必答题。面对日益复杂的市场竞争和不断变化的客户需求&#xff0c;传统的开发模式常常显得力不从心——开发周期冗长、技术门槛高、成本居高不下&#xff0c;企业很难快速响应市场变化。而在这种背景下&…

WPF中实现PasswordBox的双向绑定

我们知道一个属性想要实现双向绑定&#xff0c;最基本的便是这个属性需要时依赖属性&#xff0c;但是微软工程师在设计的时候Password并不是依赖属性&#xff0c;那我们想要实现双向绑定该怎么去做呢&#xff1f; 最常用的便是改造PasswordBox,为它增加一个扩展属性&#xff0c…

聚链成网,趣链科技参与 “跨链创新联合体”建设

近日&#xff0c;2024全球数商大会在上海举办。大会由上海数据集团和上海市数商协会联合主办&#xff0c;上海市数据局和浦东新区人民政府支持&#xff0c;以“数联全球&#xff0c;商通未来——‘链’接数字经济新未来”为主题&#xff0c;聚焦区块链技术和应用场景展开。 会上…

记录一次mmpretrain训练数据并转onnx推理

目录 1.前言 2.代码 3.数据形态【分类用】 4.配置文件 5.训练 6.测试-分析-混淆矩阵等等&#xff0c;测试图片效果等 7.导出onnx 8.onnx推理 9.docker环境简单补充 1.前言 好久没有做图像分类了&#xff0c;于是想用商汤的mmclassification快速搞一波&#xff0c;发现已…

文心一言 VS 讯飞星火 VS chatgpt (380)-- 算法导论24.4 12题

十二、给出一个有效算法来解决 A x ⩽ b Ax⩽b Ax⩽b 的差分约束系统&#xff0c;这里 b b b 的所有元素为实数&#xff0c;而变量 x i x_i xi​ 中某个给定的子集是整数。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 差分约束系统问题通常用于解决带有约…

CSS网格布局

前言 希望元素按照网格的方式进行布局&#xff0c;最简单的方式就是利用网格布局&#xff0c;如图所示&#xff1a; 网格布局 设置网格布局的核心属性&#xff1a; ① display: grid 设置容器为网格布局容器&#xff08;如果希望设置行内的网格容器&#xff0c;可以设置disp…