摘要

在之前的文章DDD-CQRS能解什么问题中,阐述了什么是CQRS。但是并没有业务需求可以应用CQRS。最近需要处理一个文本增量更新的业务,经过需求分析后,尝试使用CQRS来解这个问题

问题分析

一个文本页面编辑,对象很大,之前是全量保存。涉及到的网络传输对象比较大,经常超时OOM,所以交互改成,只保存修改的部分,也就是增量更新。

之前业务中没法使用CQRS,在于使用CQRS后,数据的维护变得异常麻烦。比如我对一个表单进行了反复修改,生成了N份历史修改数据,获取最新数据时需要对这些历史数据进行合并,变得异常麻烦。
这次业务能够使用在于,

  1. 拆分写,能够有效的减少数据传输。
  2. 读写可以分离,分别扩展
  3. 通过事件溯源,可以恢复数据到任意编辑的版本

具体设计

系统整体采用CQRS+Event-Sourcing来实现

CQRS

CQRS模式通过使用不同的接口来分离读取数据和更新数据的操作。CQRS模式可以最大化性能,扩展性以及安全性,
还会为系统的持续演化提供更多的弹性,防止Update命令在域模型Level发生冲突。

文本编辑这块领域模型很薄,没有什么领域校验与约束,按读取数据/更新数据分离,当读写压力不同时,以后可以拆分成不同的服务,分别扩展。

Event Sourcing(事件溯源)

a.不保存对象的最新状态,而是保存对象产生的所有事件
b.通过事件溯源(Event Sourcing,ES)得到对象最新状态;

系统整体分为三大部分

一. command

所有数据修改命令,更新Command、撤销Command、覆盖Command
会持久化存储到CommitRepository中。然后发出事件消息

二. event-handle

对于文本编辑这个case,事件处理主要是合并提交的command event。否则事件溯源时,需要处理的数据更新事件太多,耗时太长。

三. query

查询数据,能够根据修改记录获取任意commit的数据。

三大部分分离,可以部署为单个服务,也可以解耦为多个服务,便于扩展。

需要解决的问题

  1. 如何保证事件的有序性

CQRS的一个典型问题就是生产端的事件顺序和消费端的事件顺序不一致,导致数据不一致的问题。如何去解决呢?

Command处理部分处理所有的数据更新部分,会生成一个全局有序的commitid,代表着更新的顺序。也就是生产端的事件顺序,但是到达我们消费端的顺序却不一定是这个顺序。所以消费端,事件处理完成后,会更新消费的最新commitid。如果当前事件的commitid小于最新的commitid,事件遗弃。

  1. 如何保证读数据性能
    event handle部分会去合并commit,所以读数据不是从所有的修改数据commit中合并数据。数据已经预先处理了,所以会大大加快读取效率,可以控制待合并的数据在5~10commits范围之内。

  2. 数据会丢失吗

系统分离后,没有事务保证,数据的完整性如何保证。

当数据更新Command写入成功后,代表这条数据更新成功,这个数据就不会丢失。因为这些数据都已经被持久化了,剩下的问题就是读取这些提交的Command Commit。我们可以通过合并这些commit,得到最新的完整数据。所以即使event-handle部分宕机了,仍然可以读取到最新的数据。

说明

这个案例还是没有应用框架,调研过axon,评估目前还不是太适合用,代码可读性不强,带来的好处不明显。后续再考虑是否需要引入框架。

DDD系列

我们团队是如何落地DDD的(1)

可落地的DDD的(2)-为什么说MVC工程架构已经过时

可落地的DDD(3)-如何利用DDD进行微服务的划分

可落地的DDD(4)-如何利用DDD进行微服务的划分(2)

可落地的DDD(5)-战术设计

如何避免写出烂的业务代码(1)-领域对象与领域服务

如何避免写出烂的业务代码(2) DDD整改

DDD-CQRS能解什么问题

一次关于聚合根的激烈讨论

DDD-CQRS的落地案例相关推荐

  1. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  2. (转)DDD CQRS和Event Sourcing的案例:足球比赛

    原文链接: https://www.jdon.com/44815 在12月11日新的有关DDD CQRS和Event Sourcing演讲:改变心态- 以更加面向对象视角看待业务领域建模中,作者以足球 ...

  3. 领域驱动DDD在签到场景落地案例之架构模式(二)

    承接DDD概念初识第二篇,第一篇传送地址:领域驱动DDD在签到场景落地案例之概念初识(一) 本篇文章介绍微服务设计原则,以此为设计思想,然后列举DDD常见架构模式,不同架构方式对比,在工作中根据业务选 ...

  4. 如何使用 DSL 实现 DDD 的快速落地

    开发大型软件最难的部分并不是实现,而是要深刻理解它所服务的现实世界的领域.领域驱动设计(Domain-Driven Design,DDD) 是一种处理高度复杂领域的愿景(Vision)和方法,它主张在 ...

  5. 哈喽出行在DDD方面的落地

    本文章出自柴华老师在[deeplus直播第273期]线上分享演讲内容,由本人在网上收集到的线上分享的文字版本. 我们今天的主题<DDD在哈啰交易中台的实践>,最近几年中台微服务越来越火,D ...

  6. DDD CQRS架构和传统架构的优缺点比较

    DDD CQRS架构和传统架构的优缺点比较 https://mp.weixin.qq.com/s?src=3&timestamp=1503011877&ver=1&signat ...

  7. 两大电网大手笔投建能源大数据中心,15省都有哪些落地案例?

    在新型电力系统和双碳目标下,能源数据要素的放大.叠加.倍增效应日益凸显,能源大数据中心已在全国遍地开花. 究竟什么是能源大数据中心?全国各地都有哪些落地项目呢? 一:什么是能源大数据中心? 能源大数据 ...

  8. 关于机器学习,你应该至少学习这8个落地案例|干货集锦

    机器学习.深度学习.强化学习.迁移学习,这些你到底了解多少?各种深度学习框架如TensorFlow.Caffe.MXNet等又该如何选择?如何将机器学习整合到正在开发的应用中?机器学习在金融.电商.外 ...

  9. 【零信任落地案例】启明星辰中国移动某公司远程办公安全接入方案

    1方案背景 电信运营商作为大体量通信骨干企业,承担着国家基础设施建设责任,具备 为全球客户提供跨地域.全业务的综合信息服务能力和客户服务渠道体系.电信 运营商安全体系建设相对于其他行业,具有专业深.覆 ...

  10. 【零信任落地案例】吉大正元某大型集团公司零信任实践案例

    1方案背景 随着信息化技术不断发展,企业智慧化.数字化理念的不断深化已经深入各个领域, 云计算.大数据.物联网.移动互联.人工智能等新兴技术为客户的信息化发展及现代 化建设带来了新的生产力,但同时也给 ...

最新文章

  1. WebSphere概要文件类型
  2. 百个JavaScript函数以及基础写法汇总
  3. [转载]关于request和session详解
  4. linux 文件与进程
  5. 设置、查看环境变量值
  6. 【可持久化线段树?!】rope史上最全详解
  7. 【Linux网络编程】TCP
  8. windows安装linux无法启动服务,Windows系统下Apache服务器无法启动的问题解决
  9. 大幅减少GPU显存占用:可逆残差网络(The Reversible Residual Network)
  10. Spark 3.0 发布了,代码拉过来,打个包,跑起来!| 附源码编译
  11. php 禁止浏览器直接访问网页_.php后缀的url地址在浏览器打开怎么不让他下载,而是访问...
  12. jQuery EasyUI 简介
  13. 基于JAVA疫情防控期间网上教学管理计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  14. ARCore1.2使用入门(一) ------ 将ARCore案例打包成Android/iOS运行测试(unity开发)
  15. 【Zynq UltraScale+ MPSoC解密学习10】Zynq UltraScale+的PS互连
  16. 设计任务调度依赖配置表
  17. CINTA作业六:拉格朗日定理
  18. 鼠标右键多余菜单的清理
  19. win10输入法添加美式键盘(符合Win7习惯)
  20. Linux替换Docker镜像源

热门文章

  1. JAVA毕业设计汇美食电子商城计算机源码+lw文档+系统+调试部署+数据库
  2. nrf24l01怎么用
  3. 显卡风扇狂转的解决方案
  4. spring-boot系列8:集成redis
  5. 对话浙大博导吴飞:人工智能的前世今生
  6. “知识就是力量”的理解
  7. 怎么制作百度百科简介,创建自己的百度百科怎么弄
  8. 车载以太网 | 测试之实锤-1000BASE-T1物理层PMA测试实践
  9. EasyPermissions替换默认Dialog
  10. vue高仿饿了么APP(二)