刚换了个工作,闲话不说了。前两天开始一个新项目,大概是一个任务管理系统,由使用者来选取任务,执行任务,反馈完成,我大概做了些设计,本来是打算看能不能在新公司铺垫一下DDD,不过后来这块功能没分到我这,也就没办法了。不过如果分到我这,这个设计估计也不能写博客发了。

  具体需求不多说,这个系统很像穿越小说里的佣兵悬赏系统。

  发布任务,由被认证为有资格执行的人去抢任务,抢到了任务,去执行任务,完成任务获得金币奖励。

  很清晰的几个阶段,状态迁移,阶段之间的交互比较单纯,线性的,同时又不需要什么返回值,这几点上考虑,我首先想到了命令模式。同时没提到的需求是,任务多是针对一类对象,这类对象在任务执行的流程中经过分析,其状态与任务状态虽然不同,但变化几乎是同步的,有很大一致性,很明显,非常适合作为一个聚合,任务作为聚合根。确定了命令模式和聚合,作为一个可能会有一定压力的系统来说,大体上选用CQRS基本上是第一反应了。

  首先,用一个序列图验证一下思路是否行得通(ExpressParcel指的是任务针对的那类对象):

                

  命令的大致流程都差不多,就不一一贴了,当然不一定是这么多create,大致看上去,是行的通的。

  整理下,大概都用哪些对象,哪些命令:

                        

  上面是聚合,接收命令的服务和命令的发出角色,下面是命令:

                  

  命令的作用其实也很简单,只是通知状态变化和积分金币的变化。另外,还有一块,只画了个意思,就不贴了。大概说一下,CQRS的重点是读写分离,从这个角度来说,它对性能是比较关注的,命令模式也很适合异步执行,有助于吞吐能力的提升,而为了更进一步的提升,在TaskService接收了命令后,可以不直接执行,而将命令转为事件消息放入消息队列,由另外的服务去拉取执行。到这里,非常适合这种架构也是多数这种架构采取的配套方案也就是事件持久化了,补充一句,这里的事件只是一个概念,说明需要发生什么,并不是指.net的event之类的。不过我并没打算采用事件持久化的方案。

  下面说一下我感觉的事件持久化的优缺点,也方便有合适的场景的时候斟酌使用。

  优点:可以让静态的数据反映出系统曾经发生过的所用动态的变化,弥补了日志的不足,对监控有很大帮助;

     使数据库结构变得简单,主要部分的基础结构只有一种,就是事件的结构;

     让程序员可以更专注于逻辑和业务,脱离表驱动造成的数据库与逻辑的耦合,避免被静态数据限制动态的业务。

  缺点:查询统计BI等需要另外一套表结构,也就是一份数据需要保存两种不同的形式;

     一旦系统需要重启,所有事件都需要重演,即使使用快照也不能彻底解决问题,启动时间长,不利于频繁的迭代发布;

     局部小附加功能的灵活性无法保证,除非系统不使用统一的解决方案。

新项目的CQRS设计的更多相关文章

  1. 新项目的vue组件

    项目地址:http://pan.baidu.com/s/1qYIxCXu 很久没有写博客的原因的是之前一直在解决一个问题,这个问题就是:我们在写组件的时候,官方推荐把css写在组件里面,但是如果我们写 ...

  2. java新项目的eclipse统一配置记录

    1.new java file的模版 /** * @Title:${file_name} * @Copyright: Copyright (c) 2016 * @Description: * < ...

  3. 做一个创建cocos2d-x新项目的shell脚本

    1. 进入console目录 cd /Users/apple/Documents/MyArchitecture/Cocos2d-x/Framework/cocos2d-x-3.4/tools/coco ...

  4. 搜刮一些开源项目的APP

    iOS完整App资源收集 <iOS完整app资源收集>  <GitHub 上有哪些完整的 iOS-App 源码值得参考?> <GitHub 上有哪些完整的 iOS-App ...

  5. 团队项目——编写项目的Spec

    团队项目--编写项目的Spec 一.Spec的目标        spec主要用来说明软件的外部功能,和用户的交互情况,主要用来说明软件内部的设计.图片编辑器是与生活息息相关的一个必备软件,随的流行, ...

  6. 如何修改MyEclipse项目的web context-root

    修改一个MyEclipse项目的名称很容易,右键点项目->rename就行了. 但此时项目的web context-root 还没有改变,需要右键点项目->properties->M ...

  7. 谈谈软件项目的dependency

    说到软件项目的依赖管理,可以从三个方面来考虑: 一.由build system控制的dependency 现在的build system,都支持一定程度上的dependency management, ...

  8. 学习笔记——Maven实战(三)多模块项目的POM重构

    重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段 ...

  9. 老项目的#iPhone6于iPhone6Plus适配#iPhone6分辨率与适配

    技术博客http://www.cnblogs.com/ChenYilong/    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4011744.html ,转 ...

随机推荐

  1. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)

    上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...

  3. .NET Core 系列5 :使用 Nuget打包类库

    NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全使用Nuget 管理组件之间的依赖关系, ...

  4. .Net多线程编程—System.Threading.Tasks.Parallel

    System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...

  5. Consul 服务注册与服务发现

    上一篇:Mac OS.Ubuntu 安装及使用 Consul 1. 服务注册 对 Consul 进行服务注册之前,需要先部署一个服务站点,我们可以使用 ASP.NET Core 创建 Web 应用程序 ...

  6. vue入门学习(基础篇)

    vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...

  7. bash字符串操作

    参考 http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 问题:bash怎么提取字符串的最后一位?例如python中strin ...

  8. 【JQ基础】数组

    each() 方法规定为每个匹配元素规定运行的函数.

  9. Visual Studio Code——Angular2 Hello World 之 2.0

    最近看到一篇用Visual Studio Code开发Angular2的文章,也是一篇入门教程,地址为:使用Visual Studio Code開發Angular 2專案.这里按部就班的做了一遍,感觉 ...

  10. Linux环境下常见漏洞利用技术(培训ppt+实例+exp)

    记得以前在drops写过一篇文章叫 linux常见漏洞利用技术实践 ,现在还可以找得到(https://woo.49.gs/static/drops/binary-6521.html), 不过当时开始 ...