新项目的CQRS设计
刚换了个工作,闲话不说了。前两天开始一个新项目,大概是一个任务管理系统,由使用者来选取任务,执行任务,反馈完成,我大概做了些设计,本来是打算看能不能在新公司铺垫一下DDD,不过后来这块功能没分到我这,也就没办法了。不过如果分到我这,这个设计估计也不能写博客发了。
具体需求不多说,这个系统很像穿越小说里的佣兵悬赏系统。
发布任务,由被认证为有资格执行的人去抢任务,抢到了任务,去执行任务,完成任务获得金币奖励。
很清晰的几个阶段,状态迁移,阶段之间的交互比较单纯,线性的,同时又不需要什么返回值,这几点上考虑,我首先想到了命令模式。同时没提到的需求是,任务多是针对一类对象,这类对象在任务执行的流程中经过分析,其状态与任务状态虽然不同,但变化几乎是同步的,有很大一致性,很明显,非常适合作为一个聚合,任务作为聚合根。确定了命令模式和聚合,作为一个可能会有一定压力的系统来说,大体上选用CQRS基本上是第一反应了。
首先,用一个序列图验证一下思路是否行得通(ExpressParcel指的是任务针对的那类对象):
命令的大致流程都差不多,就不一一贴了,当然不一定是这么多create,大致看上去,是行的通的。
整理下,大概都用哪些对象,哪些命令:
上面是聚合,接收命令的服务和命令的发出角色,下面是命令:
命令的作用其实也很简单,只是通知状态变化和积分金币的变化。另外,还有一块,只画了个意思,就不贴了。大概说一下,CQRS的重点是读写分离,从这个角度来说,它对性能是比较关注的,命令模式也很适合异步执行,有助于吞吐能力的提升,而为了更进一步的提升,在TaskService接收了命令后,可以不直接执行,而将命令转为事件消息放入消息队列,由另外的服务去拉取执行。到这里,非常适合这种架构也是多数这种架构采取的配套方案也就是事件持久化了,补充一句,这里的事件只是一个概念,说明需要发生什么,并不是指.net的event之类的。不过我并没打算采用事件持久化的方案。
下面说一下我感觉的事件持久化的优缺点,也方便有合适的场景的时候斟酌使用。
优点:可以让静态的数据反映出系统曾经发生过的所用动态的变化,弥补了日志的不足,对监控有很大帮助;
使数据库结构变得简单,主要部分的基础结构只有一种,就是事件的结构;
让程序员可以更专注于逻辑和业务,脱离表驱动造成的数据库与逻辑的耦合,避免被静态数据限制动态的业务。
缺点:查询统计BI等需要另外一套表结构,也就是一份数据需要保存两种不同的形式;
一旦系统需要重启,所有事件都需要重演,即使使用快照也不能彻底解决问题,启动时间长,不利于频繁的迭代发布;
局部小附加功能的灵活性无法保证,除非系统不使用统一的解决方案。
新项目的CQRS设计的更多相关文章
- 新项目的vue组件
项目地址:http://pan.baidu.com/s/1qYIxCXu 很久没有写博客的原因的是之前一直在解决一个问题,这个问题就是:我们在写组件的时候,官方推荐把css写在组件里面,但是如果我们写 ...
- java新项目的eclipse统一配置记录
1.new java file的模版 /** * @Title:${file_name} * @Copyright: Copyright (c) 2016 * @Description: * < ...
- 做一个创建cocos2d-x新项目的shell脚本
1. 进入console目录 cd /Users/apple/Documents/MyArchitecture/Cocos2d-x/Framework/cocos2d-x-3.4/tools/coco ...
- 搜刮一些开源项目的APP
iOS完整App资源收集 <iOS完整app资源收集> <GitHub 上有哪些完整的 iOS-App 源码值得参考?> <GitHub 上有哪些完整的 iOS-App ...
- 团队项目——编写项目的Spec
团队项目--编写项目的Spec 一.Spec的目标 spec主要用来说明软件的外部功能,和用户的交互情况,主要用来说明软件内部的设计.图片编辑器是与生活息息相关的一个必备软件,随的流行, ...
- 如何修改MyEclipse项目的web context-root
修改一个MyEclipse项目的名称很容易,右键点项目->rename就行了. 但此时项目的web context-root 还没有改变,需要右键点项目->properties->M ...
- 谈谈软件项目的dependency
说到软件项目的依赖管理,可以从三个方面来考虑: 一.由build system控制的dependency 现在的build system,都支持一定程度上的dependency management, ...
- 学习笔记——Maven实战(三)多模块项目的POM重构
重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段 ...
- 老项目的#iPhone6于iPhone6Plus适配#iPhone6分辨率与适配
技术博客http://www.cnblogs.com/ChenYilong/ 本文永久地址为http://www.cnblogs.com/ChenYilong/p/4011744.html ,转 ...
随机推荐
- 页面嵌入dom与被嵌入iframe的攻防
1.情景一:自己的页面被引入(嵌入)至别人的页面iframe中 if(window.self != window.top){ //url是自己页面的url window.top.location.hr ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- 【SQLServer】【恢复挂起的解决方案】附加文件时候的提示“无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的。 ”【数据库恢复】
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 先贴错误: 吐槽一下: 进入正题: 新建一个同名数据库 停止MSSQL服务 替换数据库文 ...
- UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件
在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...
- C# 生成验证码图片时消除锯齿
引言 基于生成图片实现了一个手机号转图片的需求. 内容也很简单,直接用手机号生成一个png图片.就是为了背景透明以便其他地方调用. 有无锯齿主要依靠一句代码:g.TextRenderingHint= ...
- JDBC Tutorials: Commit or Rollback transaction in finally block
http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...
- 玩转ajax
1.什么是ajax? Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写. 2.ajax需要什么基础? HTML 用于建立 Web 表单并确定应 ...
- AFNetworking报错"_UTTypeCopyPreferredTagWithClass", referenced from: _AFContentTypeForPathExtens
问题: 在和Unity交互的过程中,从Unity开发工具打包出来的项目文件,在添加AFNetworking库,运行时报出以下错误: Undefined symbols for architecture ...
- (转载)linux下各个文件夹的作用
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...
- Windows Server 2008 R2 下配置TLS1.2,添加自签名证书
前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...