10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

评论

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

从react源码看hooks的原理

flyzz177

React

EMQX Cloud Serverless正式上线:实现三秒部署的MQTT Serverless云服务

EMQ映云科技

物联网 IoT mqtt emqx 企业号 2 月 PK 榜

阿里前端必会手写面试题汇总

helloworld1024fd

JavaScript

NFT艺术品代币如何进行赋能?系统开发定制

开发微hkkf5566

全栈角度看分页处理

京东科技开发者

数据库 前端 Web 开发 框架

手写JS函数的call、apply、bind

helloworld1024fd

JavaScript

面试官问我:CSS有哪些属性可以继承

华为云开发者联盟

前端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

BALENCIAGA 3XL 限量款数字藏品

科技热闻

Java高手速成 | 对象-关系的映射、映射对象标识符与JPA API的级联操作

TiAmo

Java jpa API 编排

深度分析React源码中的合成事件

goClient1992

React

手写一个react,看透react运行机制

goClient1992

React

开源工具系列4:Nuclei

HummerCloud

网络安全 漏洞扫描

vivo 自研Jenkins资源调度系统设计与实践

vivo互联网技术

运维 jenkins 资源调度

20个 Git 命令玩转版本控制

SEAL安全

git 企业号 2 月 PK 榜 git command

深入React源码揭开渲染更新流程的面纱

goClient1992

React

基于昇腾计算语言AscendCL开发AI推理应用

华为云开发者联盟

人工智能 华为云 昇腾 企业号 2 月 PK 榜 华为云开发者联盟

0源码基础学习Spring源码系列(一)——Bean注入流程

京东科技开发者

spring 开源 后端

【从零开始学爬虫】采集全球海关进出口新闻数据

前嗅大数据

大数据 爬虫 海关

焕新启航,「龙蜥大讲堂」2023 年度招募来了!13 场技术分享先睹为快

OpenAnolis小助手

直播 开源社区 龙蜥大讲堂 机密计算 月度主题

怎样徒手写一个React

helloworld1024fd

JavaScript

QCon演讲实录(上):多云环境下应用管理与交付实践

阿里云大数据AI技术

大数据 运维 企业号 2 月 PK 榜 云环境

5分钟体验代码仓托管、CloudIDE云端代码编辑、调试、运行

华为云开发者联盟

云计算 华为云 企业号 2 月 PK 榜 华为云开发者联盟

从recat源码角度看setState流程

flyzz177

React

react的useState源码分析

flyzz177

React

前端工程师leetcode算法面试必备-二分搜索算法(下)

js2030code

JavaScript LeetCode

无锡正规等级测评公司有几家?分别叫什么?

行云管家

等保 堡垒机 网路安全 等级保护 无锡

前端一面常考手写面试题整理

helloworld1024fd

JavaScript

前端工程师leetcode算法面试必备-二分搜索算法(中)

js2030code

JavaScript LeetCode

聚焦能碳数智化 百度智能云度能亮相2022世界物联网大会

极客天地

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