刚换了个工作,闲话不说了。前两天开始一个新项目,大概是一个任务管理系统,由使用者来选取任务,执行任务,反馈完成,我大概做了些设计,本来是打算看能不能在新公司铺垫一下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. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  2. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  3. AJAX 大全

    本章内容: 简介 伪 AJAX 原生 AJAX XmlHttpRequest 的属性.方法.跨浏览器支持 jQuery AJAX 常用方法 跨域 AJAX JsonP CORS 简单请求.复制请求.请 ...

  4. jquery学习(一)

    简单的jquery学习,首先在页面引入jquery <!-- 引入jquery --> <script src="js/jquery-1.8.3.js" type ...

  5. css样式之超出隐藏

    文本超出部分隐藏,总结两种方法. 1.单行隐藏 html代码 <div class="mi">当文字超过范围的时候,超出部分会隐藏起来.</div> css ...

  6. 【干货分享】流程DEMO-加班与调休

    流程名: 加班.调休  业务描述: 加班: 工作日加班可以申请调休,也可以申请支付加班费.原则上都应申请调休:周末加班原则上申请调休:法定节假日加班支付加班费. 加班申请以半小时为单位. 当月加班不能 ...

  7. postgresql无法安装pldbgapi的问题

    要对函数进行调试需要安装插件pldbgapi,当初在windows上面的postgresql实例中执行了一下语句就安装上了: create extension pldbgapi; 但是在linux中执 ...

  8. tg2015 信息传递 (洛谷p2661)

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  9. 【译】Meteor 新手教程:在排行榜上添加新特性

    原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...

  10. Android AppBar

    AppBar官方文档摘记 2016-6-12 本文摘自Android官方文档,为方便自己及其他开发者朋友阅读. 章节目录为"Develop > Training > Best P ...