2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

评论

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

用 K3s 来运行安装和极狐GitLab Runner

极狐GitLab

微信业务架构图 & 学生管理系统架构设计

smile

架构实战营

微信业务架构+学生管理系统毕设方案

李大虾

#架构实战营 「架构实战营」

行业先锋畅聊 Flink 未来 —— FFA 2021 圆桌会议(北京)

Apache Flink

大数据 flink 编程 后端 实时计算

一条SQL查询语句是如何执行的?

蝉沐风

MySQL sql 面试

亚信科技AntDB数据库荣获“2021金融科技应用创新突出贡献奖”

亚信AntDB数据库

AntDB 金融行业 亚信科技

混沌工程之ChaosMesh使用之模拟CPU使用率

zuozewei

混沌工程 Chaos Mesh 1月月更

深入理解Python内存管理与垃圾回收

宇宙之一粟

Python 内存管理 1月月更

Hive 数据倾斜问题定位排查及解决

五分钟学大数据

hive 1月月更

作业帮基于 Flink 的实时计算平台实践

Apache Flink

大数据 flink 编程 实时计算 IT

征文投稿丨在轻量应用服务器上部署SpringBoot项目

阿里云弹性计算

阿里云 用户投稿 轻量应用

Awesome DAO 文章和资源推荐(8/100)

hackstoic

DAO

SparkSQL的入门实践教程

华为云开发者联盟

sql spark 编程 Sparksql 结构化数据

面向复杂度架构设计之学生管理系统

晨亮

「架构实战营」

Fabric.js 将本地图像上传到画布背景

德育处主任

前端 数据可视化 前端可视化 FabricJS Fabric.js

模块一

Geek_f3e842

架构实战营

自动驾驶浪潮下,如何给技术迭代插上数据的“翅膀”?

澳鹏Appen

人工智能 自动驾驶 智能汽车 智能驾驶 数据标注

Hive企业级性能优化

五分钟学大数据

hive 1月月更

微信业务架构图及学生管理系统架构设计实践

IT屠狗辈

系统架构 架构实战营 微信业务架构图

如何使用JavaScript开发AR(增强现实)移动应用

汪子熙

JavaScript AR 1月月更 增强现实

一文了解 MySQL 中的锁

Ayue、

MySQL 数据库 1月月更

Web or Native 哪个才是元宇宙的未来(下)?

Orillusion

WebGL 元宇宙 Metaverse webgpu

代码之外的生存指南,先掌握这五步。

叶小鍵

低代码实现探索(三十)低代码设计器设计方式

零道云-混合式低代码平台

SAST 为什么会成为网络安全领域的下一件大事?

旋极智能

静态分析 静态测试工具 代码静态分析

ReactNative进阶(三十五):应用脚手架 Yo 构建 RN 页面

No Silver Bullet

React Native 1月月更 BloC yo

微信业务架构、学生管理系统(草稿)

Geek_16d2b8

架构训练营

一个cpp协程库的前世今生(二十四)对象池与栈内存池

SkyFire

c++ cocpp

Mybatis中的VFS是个啥

尹昶胜

mybatis

为什么需要闭包?闭包是什么概念?

蜜糖的代码注释

Java 后端 开发

TortoiseSVN 执行清理( cleanUp )失败的解决方案

编程三昧

svn 开发工具 1月月更

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