Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DDD-CQRS的落地案例

DDD-CQRS的落地案例

作者头像
方丈的寺院
发布于 2020-02-18 15:27:13
发布于 2020-02-18 15:27:13
1.3K0
举报
文章被收录于专栏:方丈的寺院方丈的寺院

摘要

在之前的文章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,评估目前还不是太适合用,代码可读性不强,带来的好处不明显。后续再考虑是否需要引入框架。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方丈的寺院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
融球效果(shader)
元球也叫融球,它能够让两个球体产生“黏糊糊”的效果,是流体、融合等效果的实现基础,异名这次实现的demo是一个固定的大圆,然后手指控制一个游离态的小圆,它们靠近的时候会产生融合的效果
异名
2020/06/09
1.4K0
用 Shader 写个完美的波浪~
根据我多年喝奶茶的经验,像这种效果用 Shader 做就再简单不过了,最终的效果如下:
陈皮皮
2020/09/10
1.9K0
追光效果
追光效果是在舞台全场黑暗的情况下用光柱来突出角色或其他特殊物体,还可以通过操控光源来跟随人物移动。追光效果主要用来突出角色主体以及主体和环境的关系,在游戏中可以用来营造沉浸式氛围以及聚焦玩家视线焦点
异名
2020/06/09
7970
圆形头像(shader)
可以使用一张圆的图片,然后配合mask的反向遮罩来实现,但是这种实现的效果会有锯齿,所以一般会写一个shader。异名上篇文章中追光效果中那个shader刚好直接就可以使用了,这系列的定位是常用功能集锦,圆形头像又是高频应用,因此异名就再单独拿出来再水一篇,方面后面查看使用。
异名
2020/06/09
2.1K0
渐变过渡的相册(shader)
相册是一个大家比较熟悉的场景,一般我们是实现的都是那种跑马灯式的轮播相册,这里异名给大家提供一个利用shader实现图片渐变过渡的相册思路
异名
2020/06/09
4570
颜色滤镜
我们手机上有很多照片处理软件,图片滤镜是里面不可或缺的一部分,我们可以先尝试一些很简单的滤镜的算法,管中窥豹地去认识一下色彩的处理
异名
2020/06/09
2.3K0
OpenGL & Metal Shader 编程:ShaderToy 内置全局变量
前面发了一些关于 Shader 编程的文章,有读者反馈太碎片化了,希望这里能整理出来一个系列,方便系统的学习一下 Shader 编程。
字节流动
2023/09/04
1.3K0
OpenGL & Metal Shader 编程:ShaderToy 内置全局变量
【前端er入门Shader系列】05—在cocos中使用shader实现简单特效
前面在浏览器环境中基于 WebGL 的 GLSL 代码编写顶点(Vertex)和片元(Fragment)的 Shader 程序,在游戏引擎中,为了适配工业化制作流,提升着色器片段的易用性,往往会有一些额外的处理,本章将介绍在 cocos creator 中编写 Shader 程序,可以参考官方文档 https://docs.cocos.com/creator/3.8/manual/zh/shader/
CS逍遥剑仙
2025/02/04
6160
开源 2D 实时水面反射效果,源码详解!
引言:插件 Easy NavMesh、BenchMark 性能检测的作者孙二喵,从开发者王师傅的论坛分享中获得启发,实现了 2D 实时水面反射效果,Demo 免费开源。
张晓衡
2023/02/23
7070
开源 2D 实时水面反射效果,源码详解!
Flutter 绘制集录 | Shader 让绘制无限强大 - 壹
在之前研究 opengl 时,知道 Shader 的强大,我们可以通过着色器完成很多特效。之前在 Android 中写过 《 [ - OpenGLES3.0 - ] 第三集 主线 - shader着色器与图片特效》 一文, 其中详细介绍了 OpenGLEs 的着色器。而
张风捷特烈
2024/02/07
8170
Flutter 绘制集录 | Shader 让绘制无限强大 - 壹
镜面光泽效果
镜面上扫过一道光泽是UI里面很常用的一种特效,通常用来强调某个物体或者凸显物体的“稀有”价值,比如卡片中扫过一道光芒等
异名
2020/06/09
5750
[ - OpenGLES3.0 - ] 第三集 主线 - shader着色器与图片特效
precision 表示精度 lowp低、mediump中、highp高 很容易想到,精度越↑,效果越↑,但着色器速度↓ in vec2 vTexCoord; 表示接受顶点的输入的vTexCoord变量 uniform 统一变量,在着色器执行期间它的值是不变的 sampler2D 类型:2D纹理
张风捷特烈
2020/04/30
1.5K0
[Cocos Creator] 一个全能的挖孔 Shader
TouchBlocker 是用来限制可点击的节点的独立组件,完整文件在 eazax-ccc/component 目录下。
陈皮皮
2020/07/10
2.8K0
[Cocos Creator] 一个全能的挖孔 Shader
4个方面入手 TiledMap 地图优化!W字干货分享
引言:如何进行 TiledMap 地图优化?开发者 Bool Chen 将分享一套行之有效的 TiledMap 地图优化方案,其中包括了渲染、解析、寻路方面。
张晓衡
2023/02/23
2.9K0
4个方面入手 TiledMap 地图优化!W字干货分享
马赛克效果(shader)
马赛克是一种常用的图像处理手段,因为这种模糊效果看上去有一个个的小格子组,便形象的称这种画面为马赛克。当画面上的马赛克格子小到一定程度的时候,画面呈现出来的风格也叫像素风
异名
2020/06/08
2.1K0
[ - OpenGLES3.0 - ] 第四集 视频接入OpenGLES3.0实现特效
@张风捷特烈 2020.12.08 未允禁转 我的公众号:编程之王 联系我--邮箱:1981462002@qq.com -- 微信: ~ END ~
张风捷特烈
2020/12/09
1.7K0
[ - OpenGLES3.0 - ]  第四集  视频接入OpenGLES3.0实现特效
水波扩散效果(shader)
水波扩散是一个比较好看的交互效果,特别是在某些以水为故事发生场景的游戏中,扩散的水波会让场景更加栩栩如生
异名
2020/06/09
2.5K0
Shader 入门与实践
Shader(着色器)是一种用于在计算机图形学中进行图形渲染的程序。它们是在图形处理单元(GPU)上执行的小型程序,用于控制图形的各个方面,如颜色、光照、纹理映射、投影等。
KhalilH
2024/05/16
9310
相关推荐
融球效果(shader)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档