写点什么

用示例程序介绍 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:104187

评论

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

重磅发布 | 3.4K Star可视化神器来啦

百度开发者中心

工具 可视化 #飞桨#

Kafka在哪些场景下会造成重复消费或消息丢失?

李尚智

Java kafka 程序员 架构 消息中间件

anyRTC新春大礼包

anyRTC开发者

音视频 WebRTC RTC

🎨 HTTP 协议的前世今生

飞天小牛肉

Java 程序员 面试 计算机网络 2月春节不断更

SDS离全面EC(纠删码)还有多远?

XSKY星辰天合

存储

【得物技术】AB实验设计实现与分流算法

得物技术

算法 AB AB testing实战 实现 得物技术

怎么理解Kafka消费者与消费组之间的关系?

李尚智

Java 大数据 程序员 架构

通过配置开关 Spring Boot 中的 @Scheduled 定时任务

和白白

Java 定时任务 springboot

Kafka生产者哪些重要的参数是我们需要注意的?

李尚智

Java kafka 程序员 架构 消息中间件

Clubhouse是个啥?一夜爆火一码难求

架构精进之路

七日更 2月春节不断更 clubhouse

第十一周作业&总结

胡益

函数式编程Stream接口真的有那么好用吗?

李尚智

Java 程序员 架构

“双循环”下的数字货币棋局

CECBC

数字货币

JDK1.8升级这么久!Stream流的规约操作有哪些?

李尚智

Java 架构 jdk 函数编程

LeetCode题解:529. 扫雷游戏,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

架构师week11 作业

Geek_xq

即构发布 LCEP 产品「RoomKit」 ,实现房间内0代码接入

ZEGO即构

重磅发布 | 2021年OpenAtom XuperChain开源技术路径

百度开发者中心

百度 #区块链#

百度亮相全球量子信息处理顶会QIP2021 推动全球量子科技进步

爱极客侠

LoraWan的第一个网关与设备

远鹏

物联网 IoT ChirpStack LoraWan

5分钟让你理解K8S必备架构概念,以及网络模型(上)

大数据 架构

Kafka消费者提交消费位移时提交的是当前消费到的最新消息的 offset 还是 offset+1?

李尚智

Java kafka 程序员 架构 消息中间件

商务部CECBC专委会-商务联络部长王聚师:中医国际化的数字创新密码

CECBC

数字

【百度技术分享】San介绍以及在百度APP的实践

百度Geek说

Java JavaScript feed

用 JSX 实现 Carousel 轮播组件

三钻

大前端 组件化 JSX

做了6年的Android,Jetpack-MVVM-高频提问和解答,看看这篇文章吧!

欢喜学安卓

android 程序员 面试 移动开发

安卓开发在线!Android面试吃透这一篇就没有拿不到的offer!大厂内部资料

欢喜学安卓

android 程序员 面试 移动开发

架构师week11总结

Geek_xq

开发Kafka消费者客户端需要注意哪些事项?

李尚智

为什么联盟链系统没有“激励”?

CECBC

区块链

Spring Boot 微服务性能下降九成!使用 Arthas 定位根因

Java架构师迁哥

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