写点什么

体验构建反应式事件驱动的 CQRS 应用

  • 2014-08-03
  • 本文字数:1143 字

    阅读完需:约 4 分钟

Duncan DeVore 在一次近期的演讲中谈到,设计一个不变的领域模型并与之进行反应式(Reactive)编程对我们的新架构而言是非常重要的需求,Duncan 在演讲中还对他构建分布式应用的体验进行了分享。该分布式应用基于 CQRS 最终一致性事件溯源 event sourcing ),并且是采用 Akka Scala 编写的,

Duncan 是一家能源公司的工程副总裁,他对 Command Query Responsibility Separation (CQRS,即命令查询职责分离) 进行了描述:将命令与查询分离到两个对象中,使它们在其他方面可以进行单独的优化,根据 Duncan 的经验,这是一种非常常见的需求。对于命令(Commands)而言,虽然它们会改变状态,但是它们并不涉及数据的编辑,它们只是行为,是一个对执行某个任务或某个动作的请求,它们更适合作为一条消息进行传递。而查询(Queries)则是位于数据存储之上的一层很轻薄的读取层,它并不是领域的映射,相反,数据通常是基于抓取(fetch)和页面结构(screen structure)存储的,并且拥有一个可以读取所有需要数据的键。将写和读分离的一个重要挑战是最终一致性,它会使得在写发生一段时间后,读取才可能展示出相同的数据。

当今大多数的业务应用都依赖对当前状态的存储,而 Duncan 认为这是由于采用了关系型数据库系统( RDBMS )的副作用。相比而言,事件溯源是针对事件的捕获,这是一种贴合自然的行为,它不会保持当前的状态,它保持的是状态的根源。我们来讲一个可以阐述这种方式优势的例子,有一个这样的需求,我们需要现有的购物车能够报告所有用户在购物车(取出商品后)所产生的订单。如果一个系统只是跟踪当前的状态,那么它只能报告新的订单,而对于基于事件的系统,所有订单的事件都保留在系统里,唯一需要做的就是向系统添加报告这项功能。

在成熟的业务模型中,行为跟踪的概念很常见。举一个例子,在一个银行账户中,每一比交易事务,比如存款和提款都会被记录下来。我们之所以信任当前的状态是因为该状态可以通过重放所有前面的交易事务来重新创建,而且该状态也可以通过对账来确认有效性。

Duncan 强调了与事件打交道的两个技术性影响,第一个是存储系统成为了一种只有追加操作(译者注:即没有更新)的架构,这种架构更加容易分发,第二个是水平分区变得更加容易,因为抓取数据时使用的只是一个单独的键。

Duncan 最后引用了他自己的一段话进行了总结:

我相信将 CQRS 和事件溯源结合可以为构建遵循反应式宣言( Reactive Manifesto )的分布式应用提供一种清晰且简明的方式。

反应式宣言 Reactive Manifesto )于 2013 年九月发布,目前已经有 6,300 人签署了该宣言。

Duncan 是一本即将出版的名为《构建反应式应用》(“Building Reactive Applications”)的图书的联合作者。

查看英文原文: Experiences Building a Reactive Event-Driven CQRS Application

2014-08-03 02:103429
用户头像

发布了 52 篇内容, 共 25.1 次阅读, 收获喜欢 5 次。

关注

评论

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

chia奇亚挖矿软件开发|chia奇亚挖矿APP系统开发

系统开发

网络协议学习笔记 Day5

穿过生命散发芬芳

网络协议 4月日更

腾讯云发布“创新成长快线”,首期向创业者赠送10亿分钟实时音视频时长

腾讯云音视频

音视频

教育是限制吗?

箭上有毒

4月日更

xch挖矿APP开发|xch挖矿系统软件开发

系统开发

合作伙伴眼中的鸿蒙,专访海雀科技研发总监李尹

Geek_283163

Substrate 合约书之合约语言框架

Patract

rust Substrate polkadot Patract Wasm

系统高可用之健康检查和健康度量那些事

vivo互联网技术

高可用 服务器

分布式消息中间件(2):Kafka系统学习—集群搭建与使用、副本机制和实时日志统计流程

北游学Java

Java kafka 分布式 中间件

MySQL 死锁套路:一次诡异的批量插入死锁问题分析

AI乔治

Java MySQL 架构

近期值得关注的四款工具

彭宏豪95

效率 工具 Mac 4月日更

Android 关于CPU类型的so文件兼容问题(ABI)

寻找生命中的美好

android native so库 abi so文件

linux高性能服务器编程--高性能服务器程序框架

赖猫

Linux 服务器开发 高性能服务器 C/C++后端

分布式消息中间件(1):Rabbitmq入门到高可用实战!学会了这个还怕被B站面试官看不起?

北游学Java

Java 分布式 RabbitMQ 中间件

chia奇亚分币软件开发|chia奇亚分币APP系统开发

系统开发

怎么理解组织?

石云升

团队建设 28天写作 职场经验 管理经验 4月日更

阿里P8独家揭秘:短期内升职加薪的方法,到底是什么?

Java架构师迁哥

JVM类加载机制笔记

风翱

4月日更 JVM类加载

Linux字符截取命令-cut

进击的梦清

Linux 运维 xshell

数据驱动的元数据组件

鲸品堂

方法论 架构设计原则 架构设计实战 数据分析方法论

贝壳基于 Flink 的实时计算演进之路

Apache Flink

flink

聚力边缘计算 共建数字中国丨浪潮边缘云ICP Edge 2.0 全新发布

【死磕JVM】什么是JVM调优?

牧小农

JVM jvm调优 JVM基础

2021团体程序设计天梯赛-部分题解

玄兴梦影

算法 比赛 算法解析

金三银四 Java 架构面试指南上线, 1000 余道大厂面试真题,送你上岸

Java 编程 程序员 架构 面试

容器 & 服务: 扩容(二)

程序员架构进阶

容器 k8s 28天写作 弹性扩容 4月日更

2021金三银四最新拼多多 +蚂蚁金服 +头条(已拿offer),面试真题分享!

Java 编程 程序员 架构 面试

基于MySQL存储的自研消息队列架构设计文档

Geek_2e7dd7

刹车失灵,数据的刹车是否也会失灵?

BinTools图尔兹

数据库 运维 dba 数据库管理工具

聪明人的训练(二十六)

Changing Lin

4月日更

IT 专业的高校大学生编程技能及就业问卷调研

Yano

问卷调查

体验构建反应式事件驱动的CQRS应用_Scala_Jan Stenberg_InfoQ精选文章