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

    本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...

  2. iOS在导航栏上居中显示分段控件(UISegmentedControl)

    UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:nil]; segmentedCont ...

  3. can't run roscore 并且 sudo 指令返回 unable to resolve host

    I'm using ubuntu14 LTS. Problems: 1. When run roscore, got a mistake and an advice to ping the local ...

  4. 算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!

    算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!

  5. 跨域问题,前端主动向后台发送cookie

    跨域是什么? 从一个域名的网页访问另一个域名的资源,就会出现跨域.只要协议.端口.域名有一个不同就会出现跨域 例如: 1.协议不同  http://www.baidu.com:80 和 https:/ ...

  6. Jexus 服务器部署导航

    说明:本索引只是方便本人查找,不涉及版权问题,所有博客,还是到元博客地址访问. <script async src="//pagead2.googlesyndication.com/p ...

  7. 透过浏览器看HTTP缓存

    作为前端开发人员,对于我们的站点或应用的缓存机制我们能做的似乎不多,但这些却是与我们关注的性能息息相关的部分,站点没有做任何缓存机制,我们的页面可能会因为资源的下载和渲染变得很慢,但大家都知道去找前端 ...

  8. Linux 系统中发博客必备的五大图片处理神器

    发博客时,总免不了要用图片说话.经过长时间的磨合,在 Linux 桌面系统下有几款图片处理软件我已经用得比较顺手了.这几款软件在 Linux 世界使用广泛,各个 Linux 发行版的软件仓库中都有自带 ...

  9. Spark笔记:复杂RDD的API的理解(上)

    本篇接着讲解RDD的API,讲解那些不是很容易理解的API,同时本篇文章还将展示如何将外部的函数引入到RDD的API里使用,最后通过对RDD的API深入学习,我们还讲讲一些和RDD开发相关的scala ...

  10. MongoDB Java Driver操作指南

    MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...