BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

用示例程序介绍CQRS和事件溯源机制

| 作者 Jan Stenberg 关注 29 他的粉丝 ,译者 董晓杰 关注 0 他的粉丝 发布于 2015年6月17日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

Sacha Barber在提升自己对CQRS(Command Query Responsibility Segregation)设计所包含的架构和模式的理解过程中,决定构建一个包含事件溯源机制的CQRS演示程序,并撰写了一篇文章解释内部工作机制。

Barber是Microsoft C# MVP,他将CQRS描述为一种分离职责的设计,可以将没有副作用的查询类读操作和更改数据的写操作职责相互分离。他的示例中采用了Vladimir Khorikov早先定义的第三种CQRS实现模式,对于读写职责均使用不同的模型和存储方式。Barber将事件溯源定义为一种方法,应用将状态的变化存储为一系列事件,并且应用不仅仅只存储当前的状态。为了得到某个对象当前的状态,应用需要取回所有的事件,并在这个对象上顺序回放。这种方法,通过重放某一时点的事件并调整相关状态,来实现追溯应用过去的状态。

使用基于事件的写模型并将读写模型的存储分离,意味着写操作端的变化都需要通过事件机制在读模型中更新。这种更新以异步的方式执行,意味着写模式下的变化可能不会立刻在后续的读操作中反映出来,并且Barber注意到应用程序当前是处于一种确保最终一致性的状态。基于此,他认为典型的CQRS实现并不适用于请求返回类型的操作,客户期盼对请求都能有即刻正确的响应。因此,Barber认为,那些从用户的角度去看,查询和写操作就相互明确区分的业务场景,更加适用于使用CQRS。

为了加深对CQRS的理解,Barber基于.Net平台构建了一个完整的示例程序,包含了CQRS的所有部分,并使用RabbitMQ消息队列实现事件溯源的异步机制,以此作为一种读写模型之间跨进程总线的交互方式。为了简化程序,他尽可能使用内存模型,包括事件的存储实现方式,这意味着程序多次运行之间的数据并不具备持久性。整个应用包含了一个命令总线、一个领域模型、一个写操作端的事件存储、一个事件总线和一个NoSql数据库,以及读操作端的事件处理器和一个数据访问层。

人们通常认为现成的CQRS框架会对应用实现CQRS设计造成障碍,但Barber考虑到自身对于CQRS经验欠缺,所以还是基于CQRSlite构建了示例程序,而CQRSLite是对早期Greg Young实现的CQRS框架的一个扩展。

查看英文原文:Introducing CQRS and Event Sourcing with a Demo Application


感谢丁晓昀对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群InfoQ好读者)。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT