【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

评论

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

React源码分析3-render阶段(穿插scheduler和reconciler)

goClient1992

React

80%的前端开发都答不上来的js异步面试题

loveX001

JavaScript

22道js输出顺序问题,你能做出几道

loveX001

JavaScript

数据指标体系搭建步骤

穿过生命散发芬芳

11月月更 数据指标体系

2022-11-15:这里有 n 个航班,它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings , 表中第 i 条预订记录 bookings[i] = [firsti, lasti,

福大大架构师每日一题

算法 rust 福大大

自制操作系统日记(6):静态桌面初步

操作系统

拿到大厂前端offer的前端开发是怎么回答面试题的

loveX001

JavaScript

如何在SpringBoot项目中,实现记录用户登录的IP地址及归属地信息?

wljslmz

日志 IP springboot 登录 11月月更

Go易错集锦、优秀开源包、实战案例合集

Go学堂

Go 内容合集 签约计划第二季 技术专题合集

React源码分析4-深度理解diff算法

goClient1992

React

前端面试中小型公司都考些什么

loveX001

JavaScript

IM开源项目OpenIM部署文档-从准备工作到nginx配置

Geek_1ef48b

简单组合逻辑电路

智趣匠

Verilog LED数码管 11月月更

更快更稳更易用: Flink 自适应批处理能力演进

Apache Flink

大数据 flink

网络安全之命令执行漏洞复现

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

教学:制作 GitHub 同步近期博客卡片

小鑫同学

前端 Github' 11月月更

Docker Compose快速部署多容器服务实战

海风极客

Docker 容器 11月月更

web前端面试技巧-如何自我介绍?如何应对hr?

肥晨

前端面试 面试技巧 11月月更

算法题学习---两个链表的第一个公共结点

桑榆

算法题 11月月更

裁员潮血洗硅谷是坏事还是好事

HoneyMoose

面试官:说说React-SSR的原理

beifeng1996

React

Pytorch实现经典模型AlexNet模型

Studying_swz

深度学习 11月月更

当前API安全产品现状

阿泽🧸

API 11月月更

JS in CSS:一键支持响应式布局

iofod jude

前端 后端 低代码 iofod

一个程序员眼中的裁员潮

HoneyMoose

IO原理(二):多路复用

苏格拉格拉

reactor nio epoll IO多路复用 IO模型

React源码分析2-深入理解fiber

goClient1992

React

【愚公系列】2022年11月 微信小程序-app.json配置属性之requiredBackgroundModes

愚公搬代码

11月月更

分布式系统设计之常见的负载均衡算法

海风极客

负载均衡 11月月更 分布式系统设计

官宣|Apache Flink 1.16 发布公告

Apache Flink

漫画|微信群聊的程序员们

肥晨

程序员生活 11月月更 程序员漫画

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