燃爆上海 5·23-24,AICon 大模型实战风暴,50+ 干货一网打尽,100% 日程上线 了解详情
写点什么

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

评论

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

如何在JavaScript中实现主题切换

南城FE

CSS JavaScript 前端 主题切换

京东商品详情数据接口python

tbapi

京东 京东商品详情数据接口 京东API接口

Part 2:NetOps与传统网络运营的区别

Geek_d82186

Part 3:为什么 NetOps 是通往 AIOps 的桥梁

Geek_d82186

某SAAS云平台系统单点登录案例基本要求分析

极客罗杰

Python笔记四之协程

Hunter熊

Python 协程

产品价值 vs Bug数量

Bruce Talk

敏捷 敏捷开发 Agile Product Owner

极狐GitLab 16.8 如期而至,快来看看有哪些功能更新!

极狐GitLab

【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(附通信协议和代码)(上)

码界西柚

分布式 Netty RPC 网络通讯 2024年第二十五篇文章

四步搞定国赛!快速入门大小模型融合的AI产品开发

飞桨PaddlePaddle

百度 产品开发 大模型 飞桨国赛 飞桨星河社区

听GPT 讲Rust源代码--compiler(48)

fliter

Part 4:NetOps 策略如何影响企业网络团队?

Geek_d82186

面向对象的思考

蔡农曰

架构 开发 软件设计 #程序员

Tonka Finance 测试网活动,开启新铭文时代财富之门

股市老人

Wireshark的捕获接口设置

小齐写代码

深入了解低代码开发:多角度分类

天津汇柏科技有限公司

低代码 低代码开发 低代码开发平台 定制软件开发 软件开发定制

# OpenIM (Open-Source Instant Messaging) Mac Deployment Guide

Geek_1ef48b

跨境通讯

cts喜友科技

通信 通讯

京东零售实践干货|简单一招竟把nginx服务器性能提升50倍

京东零售技术

nginx 后端

给你一颗“定心丸”——记一次由线上事故引发的Log4j2日志异步打印优化分析

京东科技开发者

听GPT 讲Rust源代码--compiler(47)

fliter

Part 1:什么是网络运营?你需要知道的一切

Geek_d82186

Part 5:NetOps团队的 SecOps和网络安全基础知识

Geek_d82186

基于OpenIM 实现聊天机器人功能

Geek_1ef48b

从上海到阿根廷的网络走线方式和耗时

fliter

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