背景
有些刚接触CQRS的朋友容易被Event Sourcing带到沟里去,其实CQRS和Event Sourcing没有直接的关系,本篇文章我就介绍一种不用Event Sourcing的CQRS。
最简单的CQRS架构
架构图
关键思路
一、Comamnd和Query采用完全不同的组织思路。
二、Command执行后如果希望返回数据给UI,同步的使用Query进行查询。
三、Command和Query采用一个数据库。
代码示例
下载地址:http://yunpan.cn/Q5bkD3wmVXBpv (访问密码:9c16)。
运行效果
主要代码
TestDynamicQueryController.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5
6 using Happy.Query;
7 using Happy.Query.PetaPoco;
8 using Happy.Web.Mvc.Ext;
9
10 namespace Happy.Web.Mvc.Host.Controllers
11 {
12 public class TestDynamicQueryController : DynamicQueryController<TestDynamicQueryService>
13 {
14 protected override TestDynamicQueryService QueryService
15 {
16 get
17 {
18 return new TestDynamicQueryService();
19 }
20 }
21 }
22
23 public class TestDynamicQueryService : PetaPocoDynamicQueryService
24 {
25 public TestDynamicQueryService() :
26 base(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + AppDomain.CurrentDomain.BaseDirectory + @"App_Data\TestDatabase.mdf;Integrated Security=True;Connect Timeout=30", "System.Data.SqlClient", "Tests")
27 { }
28 }
29 }
TestCommandController.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6
7 using Happy.Web.Mvc.Ext;
8 using Happy.Application;
9 using Happy.Command;
10 using Happy.Query;
11 using Happy.Web.Mvc.Host.Domain;
12
13 namespace Happy.Web.Mvc.Host.Controllers
14 {
15 public class TestCommandController : ExtJsController
16 {
17 public ActionResult Create(Test item)
18 {
19 CommandService.Current.Execute(new CreateTestCommand
20 {
21 Aggregate = item
22 });
23
24 var query = DynamicQueryObject.Create("Id = @0", new object[] { item.Id });
25 return this.NewtonsoftJson(new
26 {
27 success = true,
28 items = this.QueryService.SingleOrDefault(query)
29 });
30 }
31
32 public ActionResult Update(Test item)
33 {
34 CommandService.Current.Execute(new UpateTestCommand
35 {
36 Aggregate = item
37 });
38
39 var query = DynamicQueryObject.Create("Id = @0", new object[] { item.Id });
40 return this.NewtonsoftJson(new
41 {
42 success = true,
43 items = this.QueryService.SingleOrDefault(query)
44 });
45 }
46
47 private TestDynamicQueryService QueryService
48 {
49 get
50 {
51 return new TestDynamicQueryService();
52 }
53 }
54 }
55
56 public class CreateTestCommand : SimpleCreateCommand<Test> { }
57
58 public class CreateTestCommandHandler : SimpleCreateCommandHandler<ITestUnitOfWork, ITestRepository, Test, CreateTestCommand> { }
59
60 public class UpateTestCommand : SimpleUpdateCommand<Test> { }
61
62 public class UpdateTestCommandHandler : SimpleUpdateCommandHandler<ITestUnitOfWork, ITestRepository, Test, UpateTestCommand> { }
63 }
备注
采用这种最简单的CQRS,只是在代码层面进行职责的分离。基于Event Sourcing + In Memory + CQRS + DDD 的架构也是值得探讨和尝试的,这种架构汤雪华(http://www.cnblogs.com/netfocus/)有多难的研发和使用经验,估计他的最新框架ENode马上就发布了,到时我会用他的ENode写个Demo,ENode写的真的非常漂亮。
说探讨其实本人是想请教一下,现在聊天软件真的很多了,什么微信、微博、陌陌。用的是用得挺多的,其实对于我来说我更想知道的是他们是怎么实现的。客户端常见就是Android和IOS了,服务端实现我想应该大部分语言都可以吧,但是我目前只了解了Java这一块。
要来的终究是要来,好奇心如果没有得到满足总是有那么一点不自然。刚好公司接到一个项目必须得用户聊天及类型的功能,刚开始的真的不知道怎么动手,后面经过了一些时间后有了一定了解决。到目前已经实现了一些功能,但是我个人觉得现在的方法不能满足我现在的要求,简单说一下我现在的实现方式。
Java后台+Android客户端+IOS客户端。
Java后台,后台实现是我最想请教的,现在的对android推送用第三方平台Jpush,Jpush是用xmpp实现的。之前也考虑自己弄一个,但是这样时间不允许。这个平台对于实现一些简单的推推广告还是可以的,这样成本又不高,而且基本功能是免费的。但是用来做聊天我觉得太困难了,可以聊天。但是如果通过用imei号一个一个发貌似还要排列不然容易失败,如果是群聊的话效率更不知道怎么说了。IOS这边的推送也让我感觉特殊的头大,我用的是推通知的方法,也是一条一条消息排列推。而且服务器听说是在国外,又得在空中飞半天,真是花都要谢了。总之弄下来后面感觉 这种方法还是行不通,也不知道是不是中间有更好的方法我不知道,所以来请教一下大家,也很希望和大家一探讨一下常见的聊天工具是怎么实现的?
分类:
Server
摘要: 原文地址:http://www.uml.org.cn/zjjs/201108111.asp1.集群1.1定义:是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机。如一个提供Web服务的集群,对外界来看是一个大Web服务器。不过集群的节点也可以单独提供服务。1.2负载均衡系统:集群中所有的节点都处于活动状态,它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。负载均衡集群一
阅读全文
2013年4月23日
摘要: 先贴一下流程图:以及图片的来源地址:http://msdn.microsoft.com/en-us/library/jj591569.aspx问题的分析与思考,等想清楚了再写。现在只是先备忘 一下这个图。
阅读全文
2013年4月12日
摘要: 出处:http://coolshell.cn/articles/3649.html春节前的一篇那些炒作过度的技术和概念中对敏捷和中国ThoughtWorks的微辞引发了很多争议,也惊动了中国ThoughtWorks公司给我发来了邮件想来找我当面聊聊。对于Agile的Fans们,意料之中地也对我进行了很多质疑和批评。我也回复了许多评论。不过,我的那些回复都是关于中国ThoughtWorks咨询师以及其咨询的方法的。我对Agile方法论中的具体内容评价的不是很多,所以,我想不妨讨论一下Agile方法论中的具体的实践(以前本站也讨论过结对编程的利与弊)。那么,这次就说说TDD吧,这是ThoughtW
阅读全文
2013年4月8日
摘要: 关于借书场景的领域建模,我从以下几个方面进行分析(尽量简洁不讲废话,呵呵):1.分析模型静态结构:我分析一个领域模型的静态结构的思路一般是:先找出我们需要关心的对象,对于借书这个场景,我们关心的有:1)Account(账号):Id(账号唯一标识,自动生成), Number(卡号), Owner(账号当前拥有者用户信息), BorrowedBooks(账号当前借到的书)2)Book(书本):Id(唯一标识,自动生成),BookInfo(值对象,包含书本基本信息),Count(表示当前库存数量)3)BorrowHistory(借书历史、借书日志):AccountId(借书账号),BookId(书本
阅读全文
2013年3月31日
摘要: public interface ICommand { Guid Id { get; } } /// <summary>Command基类 /// </summary> public class Command : ICommand { public Guid Id { get; private set; } public Command() { Id = Guid.NewGuid(); } } public class CommandAsyncR...
阅读全文
2013年3月26日
摘要: 最近一直在思考一个问题:有没有这样一种可能,就是一个领域模型的状态不依赖于外部,它只负责接收外部的事件,然后根据这些事件做出响应;响应分两种:根据模型当前的内存状态进行业务逻辑处理,然后产生事件,注意:这个过程不会改变模型当前的内存状态;根据事件改变自己的状态;另外,也是最重要的,领域模型不用关心自己所产生的事件到底怎么样了,比如不关心有没有持久化,不关心是否和别的事件有并发冲突。它只管根据自己当前的内存状态做上面这两点的响应;如果这样的设想有可能,那领域模型就是真正的中央业务逻辑处理器了,和CPU很类似了。这样它才能真正快起来。简单的说就是:事件->模型->事件模型只管响应事件,
阅读全文
2013年3月12日
摘要: 原文地址:http://www.dancres.org/reading_list.htmlIntroductionI often argue that the toughest thing about distributed systems is changing the way you think. The below is a collection of material I've found useful for motivating these changes.Thought ProvokersRamblings that make you think about the wa
阅读全文
2013年3月6日
摘要: I don't believe there is anything wrong with using multiple repositoriesto fetch data in a transaction. Often during a transaction an aggregate will need information from other aggregates in order to make a decision on whether to, or how to, change state. That's fine. It is, however, the mod
阅读全文
摘要: Hi all,Just a quick question on saga persistence - how do you persist sagastate and dispatch messages while avoiding transactions and 2PC?Long story: I'm trying to reason out the logic behind sagas, in orderto understand everything better (and map concepts back to the reactiveprogramming)Basical
阅读全文
2013年3月5日
摘要: The termsagais commonly used in discussions of CQRS to refer to a piece of code that coordinates and routes messages between bounded contexts and aggregates. However, for the purposes of this guidance we prefer to use the termprocess managerto refer to this type of code artifact. There are two reaso
阅读全文
2013年2月28日
摘要: CAP理论断言任何基于网络的数据共享系统,最多只能满足数据一致性、可用性、分区容忍性三要素中的两个要素。但是通过显式处理分区情形,系统设计师可以做到优化数据一致性和可用性,进而取得三者之间的平衡。自打引入CAP理论的十几年里,设计师和研究者已经以它为理论基础探索了各式各样新颖的分布式系统,甚至到了滥用的程度。NoSQL运动也将CAP理论当作对抗传统关系型数据库的依据。CAP理论主张任何基于网络的数据共享系统,都最多只能拥有以下三条中的两条:数据一致性(C),等同于所有节点访问同一份最新的数据副本;对数据更新具备高可用性(A);能容忍网络分区(P)。CAP理论的表述很好地服务了它的目的,即开阔设
阅读全文
2013年2月26日
摘要: 1.修改IIS最大工作进程数a.请考虑以下几点:1.每一个工作进程都会消耗系统资源和CPU占用率;太多的工作进程会导致系统资源和CPU利用率的急剧消耗;2.每一个工作进程都具有自己的状态数据,如果Web应用程序依赖于工作进程保存状态数据,那么可能不支持使用多个工作进程。3. 成资源竞争,让多个工作进程运行同一个应用程序会造成资源竞争b.修改ISS最大工作进程数提高该应用程序池处理请求的性能1.在IIS 6.0的Web园(Web Garden)中,指定用于某个应用程序池的工作进程的数量就可以提高该应用程序池处理请求的性能。当服务器的负载较小,不需要额外的工作进程时,IIS 6.0在一定的时间后(
阅读全文
2013年2月24日
摘要: Clonegit clonegit@github.com:tangxuehua/eventsourcing.gitPullgit pullCommit & Pushgit statusgit add -Agit commit -a -m "commit detail"git pushPull-Requesthttp://www.worldhello.net/gotgithub/04-work-with-others/010-fork-and-pull.htmlgit add remote yourProject git@github.com:yourName/you
阅读全文
2013年2月22日
摘要: 原文地址:http://www.blogjava.net/libin2722/articles/346055.htmlNoSQL数据库笔谈颜开v0.22010.2序思想篇CAP最终一致性变体BASE其他I/O的五分钟法则不要删除数据RAM是硬盘,硬盘是磁带Amdahl定律和Gustafson定律万兆以太网手段篇一致性哈希亚马逊的现状算法的选择Quorum NRWVector clockVirtual nodegossipGossip (State Transfer Model)Gossip (Operation Transfer Model)Merkle treePaxos背景DHTMap R
阅读全文
2013年2月21日
摘要: 原文地址:http://www.infoq.com/cn/articles/tq-why-choose-redis传统MySQL+ Memcached架构遇到的问题实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。Memcached与MySQL数据库数据一致性问题。Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支
阅读全文
2013年2月19日
摘要: MongoDBCouchDBRavenDBDocumentsFormatBSONJSONJSONMetadataNoSystemSystem + CustomVersioningNoYesIncluded Plug-inAttachmentsGridFSYesYesMap/ReduceJavaScript + othersJavaScriptLINQBulk LoadMonogoimport utilityYesYesAdhoc QueryYesNoNoStorageShardingAvailable in 1.6YesYesDurabilitySingle Server will be av
阅读全文
2013年2月16日
摘要: 最近又学习了一下LMAX架构,让我对该架构以及event sourcing模式又有了很多新的认识和疑问。注:如果不知道什么是lmax架构和event sourcing模式的看官可以自己先去查查资料:LMAX可以看看martin写的一篇文章:http://martinfowler.com/articles/lmax.htmlEvent Sourcing的资料比较多,随便google一下即可。当然,我的博客里也有大量关于这两个方面的笔记,有兴趣的可以看看。下面是我的一些最新的想法。LMAX architecture:input event + business logic processor(BL
阅读全文
2013年2月4日
摘要: 原文链接:http://blog.tianya.cn/blogger/post_read.asp?BlogID=83331&PostID=495136222013-02-01 23:29 星期五 西闪/文如果火星访客觉得地球人说着同一种语言,很可能是因为他们发现,这个世界上所有语言的短语都有着相同的结构。关于短语的规则和特点,有很多话可说。不过史蒂芬·平克认为,有一点特别值得关注,即“动词是个独裁者。”他的意思是说,主语可以省略,宾语可以不出现,但是一个短语要符合文法,动词的要求必须首先满足。动词需要的“装备”一定要完整,并且准确地出现在它所指定的位置上。否则,这个短语就会显
阅读全文
2012年12月16日
摘要: 上一篇介绍了CodeSharp.EventSourcing框架的概况和一个简单的也是最常用的使用场景,本篇文章想介绍一下如何实现异步事件订阅。异步事件订阅是指:领域层中一个事件发出来后,事件订阅者的响应处理不是在同一个线程中同步执行,而是该事件会被放在消息队列,然后由另外一个线程从队列取出该事件消息,然后响应处理。由于消息的发出和处理不是在同一个线程和事务中实现,所以我们叫做异步事件订阅或处理。本文先简单介绍一个例子,然后讲解背后框架实现的思路。一般涉及到异步处理的,最好放在两个端点处理,一个端点发出事件消息,另一个端点响应处理事件消息;发出事件消息的端点往队列中发送消息,处理事件消息的端点从
阅读全文
摘要: 去年一次组内的技术分享会上,和几个同事讨论了Event Sourcing模式和CQRS(命令与查询分离)架构,当时觉得应该很有价值对这两个东西进行实践。所以在今年年初,我开始设计一个用于实现Event Sourcing模式和CQRS架构的框架。到目前为止框架基本稳定了,所以在园子里分享给大家。如果大家还不清楚什么是Event Sourcing或CQRS,没关系,可以看一下以下两篇文章就大概了解了。http://www.cnblogs.com/netfocus/archive/2012/02/12/2347911.htmlhttp://www.cnblogs.com/netfocus/archi
阅读全文