刚换了个工作,闲话不说了。前两天开始一个新项目,大概是一个任务管理系统,由使用者来选取任务,执行任务,反馈完成,我大概做了些设计,本来是打算看能不能在新公司铺垫一下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. 告别被拒,如何提升iOS审核通过率(上篇)

    iOS审核一直是每款移动产品上架苹果商店时面对的一座大山,每次提审都像是一次漫长而又悲壮的旅行,经常被苹果拒之门外,无比煎熬.那么问题来了,我们有没有什么办法准确把握苹果审核准则,从而提升审核的通过率 ...

  2. 02.LoT.UI 前后台通用框架分解系列之——灵活的菜单栏

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  3. 比Mysqli操作数据库更简便的方式 。PDO

    下面来说一下PDO 先画一张图来了解一下 mysqli是针对mysql这个数据库扩展的一个类 PDO是为了能访问更多数据库 如果出现程序需要访问其他数据库的话就可以用PDO来做 PDO数据访问抽象层1 ...

  4. 使用HttpClient的优解

    新工作入职不满半周,目前仍然还在交接工作,适应环境当中,笔者不得不说看别人的源码实在是令人痛苦.所幸今天终于将大部分工作流畅地看了一遍,接下来就是熟悉框架技术的阶段了. 也正是在看源码的过程当中,有一 ...

  5. PHP 设计模式概述

    一.设计模式(Design pattern)是什么? 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  6. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

  7. Aop动态生成代理类时支持带参数构造函数

    一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...

  8. 在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录

    在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录 前言 最近有个Web项目,业务功能不复杂,但是这个客户(某政府部门)有两个硬性要求:1 ...

  9. ENode 2.8 最新架构图简介

    ENode架构图 什么是ENode ENode是一个.NET平台下,纯C#开发的,基于DDD,CQRS,ES,EDA,In-Memory架构风格的,可以帮助开发者开发高并发.高吞吐.可伸缩.可扩展的应 ...

  10. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...