当前位置: 首页 > news >正文

CQRS模型解析

简介

CQRS中文意思为命令于查询职责分离,我们可以将其了解成读写分离的思想。分为两个部分 业务侧和数据侧,业务侧主要执行的就是数据的写操作,而数据侧主要执行的就是数据的读操作。当然两侧的数据库可以是不同的。目前最为常用的CQRS思想方式为事件驱动。CQRS模型也是未来微服务形态的一个趋势。

模型解析

执行流程为下:

(业务侧)

1.客户端发送Command指令。

2.服务找到处理Command对应的处理器。

3. 将事件加入到事件总线中

4.将对应的事件数据持久化到数据库。

(数据侧)

1.从事件总线中获取对应更改的事件。

2.和读数据库中的数据实体进行比较,然后更新数据库信息。

解决方案

目前比较成熟的方案为:kafka + flink + axon 来实现CQRS。

方案流程:

业务侧:
在前端调用接口后,业务侧完成对应的业务操作,发送事件消息到kafka中,并将事件消息通过axon持久化到数据库中,为此业务侧的任务就完成了。(事件消息就是写操作)

数据侧:

1.flink监听kafka中的事件消息,在监听到对应的事件消息后会到数据库中查询对应的事件数据。 

2.执行数据清洗:

  • 将事件中的数据填到主题模型中,也就是将脏数据转换为对应指定的数据。
  • 将主题模型的数据转换为持久化模型。
  • 将持久化模型sink到数据库中。

为什么要使用axon将事件数据进行持久化?

在kafka中的消息的数据是不能进行修改的,如果此时业务侧因为网络问题导致事件数据有误,在数据侧就会获取错误的数据,这明显是不合适的。所以在数据侧我们获取事件数据的最终来源为数据库,kafka中的事件消息最为驱动。(kafka主要的作用就是解耦合

在flink中为什么要将主题模型转换为持久化模型?

因为持久化的数据库可能有多个,对应的数据库字段类型有所不同,所以需要在做一个持久化模型。

*相比于MVC,CQRS框架的优势在哪里?

1. 通过将读取和写入操作分开,可以针对每种类型的操作优化数据存储。

2.由于读取和写入操作是分离的,因此可以根据需要灵活地改变任一端的数据模型或实现,而不会直接影响到另一端。

3.事件溯源,系统的状态不是直接存储的,而是通过一系列不可变的事件来重建。这为审计、回滚和调试提供了强大的工具

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Git换行符自动转换参数core.autocrlf的用法
  • 第一个Web项目(java+servlet+jsp)
  • 五种数据库特性对比(Redis/Mysql/SQLite/ES/MongoDB)
  • 人工智能 | 基于ChatGPT开发人工智能服务平台
  • git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!
  • Android 如何实现搜索功能:本地搜索?数据模型如何设计?数据如何展示和保存?
  • 二分算法——优选算法
  • [Python学习日记-26] Python 中的文件操作
  • 数据结构-树(基础,分类,遍历)
  • 黑马智数Day1
  • C++——将数组a[5]={-1,2,9,-5,7}中小于0的元素置成0。并将其结果输出(要求:用数组名作为函数的参数来实现)
  • 【无人机设计与控制】 基于matlab的蚁群算法优化无人机uav巡检
  • 通信工程学习:什么是VLAN虚拟局域网
  • go语言 数组和切片
  • C 语言数据结构中的堆与栈:深入理解与应用
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript异步流程控制的前世今生
  • JDK9: 集成 Jshell 和 Maven 项目.
  • KMP算法及优化
  • leetcode386. Lexicographical Numbers
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Rancher如何对接Ceph-RBD块存储
  • windows下mongoDB的环境配置
  • 阿里云前端周刊 - 第 26 期
  • 关于字符编码你应该知道的事情
  • 缓存与缓冲
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 积累各种好的链接
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​批处理文件中的errorlevel用法
  • ​如何在iOS手机上查看应用日志
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Redis 入门到精通(一)数据类型(4)
  • #android不同版本废弃api,新api。
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (Python第六天)文件处理
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (理论篇)httpmoudle和httphandler一览
  • (利用IDEA+Maven)定制属于自己的jar包
  • (六)Hibernate的二级缓存
  • (数据结构)顺序表的定义
  • (转) 深度模型优化性能 调参
  • (转)Scala的“=”符号简介
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET的微型Web框架 Nancy