NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 2015-06-16
  • 本文字数:1022 字

    阅读完需:约 3 分钟

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 读者交流群)。

2015-06-16 06:103448

评论

发布
暂无评论
发现更多内容

再谈跨界 互联网+的建筑行业

张老蔫

28天写作

前端大佬们都在推荐的“绿宝书”你值得拥有

华章IT

JavaScript typescript 大前端 web开发 犀牛书

浪潮云防勒索一站式解决方案,让勒索病毒“上云”无门

浪潮云

产品推荐

anyRTC-语音连麦demo上线

anyRTC开发者

音视频 WebRTC 直播 实时语音 语音聊天室

链上智能合约APP开发|链上智能合约系统软件开发

系统开发

代码编译时自动完成白盒测试,这真的可以

华为云开发者联盟

c++ 测试 代码 框架

Java单例7种测试实践

叫练

单例模式 单例 手写单例 饿汉式 懒汉式

前端代码书写规范

Mr.Cactus

大前端 html/css

2020DevOps状态报告

禅道项目管理

DevOps 运维 开发 趋势 自动化测试

Python 使用SQLServer

IT蜗壳-Tango

七日更

重学JS | 异步编程 Promise

梁龙先森

大前端 编程语言 28天写作

华为云张昆:支持全场景全业务,GaussDB加速企业数字化转型

华为云开发者联盟

数据库

智联招聘的微前端落地实践——Widget

智联大前端

大前端

CSS11 - 浮动

Mr.Cactus

html/css

大数据知识专栏 - Zookeeper的Shell操作

小马哥

大数据 zookeeper ZooKeeper原理 28天写作

云上独享资源池 自主灵活更安全

浪潮云

产品推荐

初识 D3.js :打造专属可视化

vivo互联网技术

JavaScript 数据分析 可视化 图表 D3

专科出身Java开发,2年进入苏宁,5年跳槽阿里,我晋升这么快的秘诀是什么?

Java架构追梦

Java 阿里巴巴 面试 架构师 成长路线

DevSecOps:把合规融入DevOps

啸天

DevOps 安全 法律 DevSecOps 应用安全

关于“存在”的一点思考

石君

28天写作 量子 世界为何存在

2021,加料!

浪潮云

云原生 工业互联网

Redis学习笔记01:SDS 简单动态字符串

架构精进之路

redis 七日更 28天写作

CodeDay#5 启动报名| 带你深入探索支付宝终端动态化实践

蚂蚁集团移动开发平台 mPaaS

小程序 mPaaS 2021年度技术盘点与展望 热门活动

2020DevOps状态报告——平台模型:扩展DevOps的新方法

禅道项目管理

DevOps 运维 开发 趋势 自动化测试

学习新语言步骤(有其他语言基础前提)

周周

CSS12 - 清除浮动

Mr.Cactus

html/css

区块链即时通讯系统开发方案,IM聊天社交软件开发

v16629866266

5 天开发接口系统技术小结

老魚

laravel 建站 接口开发 28天写作

2020中国云计算生态峰会召开 浪潮云摘得三项大奖

浪潮云

云服务

关于2020 我有12个关键词

浪潮云

阅读

云原生动态周报 |华为云主导抗疫药物筛选科研成果"神农项目"登上国际化学顶刊封面

华为云原生团队

GitHub 疫情 云原生 Prometheus 华为云

用示例程序介绍CQRS和事件溯源机制_语言 & 开发_Jan Stenberg_InfoQ精选文章