写点什么

领域事件与最终一致性

  • 2015-10-08
  • 本文字数:1085 字

    阅读完需:约 4 分钟

领域事件代表了领域中发生的某些事情, 当 Eric Evan 原创的 DDD 书本发行的时候并没有把它定义为一种领域驱动设计 (DDD) 模式,但现在在DDD 中已经是一种战术元素,而且是一个完整的领域模型成员。 最终一致性 是一种改进规模和性能的设计方法,而且领域事件能作为触发器承载领域信息进而协助实现, Florin Preda 在最近的博客文章 中作出了解析。

对于多数开发者都很熟悉的事务型一致性工作流中,客户在系统中执行一个命令,这个系统为维护事务中的领域一致性的需要而运行所有操作。当操作全部成功或全部失败的时候客户会收到反馈,没有中间地带。

对于常见于分布式系统的最终一致性工作流中,客户同样在系统中执行一个命令,但这个系统只为维护事务中的领域一致性运行部分的操作。剩余的操作在系统前后一致后运行。

Preda 指出虽然事务型一致性看起来更加直观和容易使用,但他觉得某些场景中最终一致性有一点优势。在他描述的四种场景中,用 A 操作之后进行 B 操作来作为例子:

  1. 操作 B 执行时间长。
  2. 操作 B 本来就是异步的,例如依赖了一个异步机制。
  3. 操作 B 是通过在相同的 有界上下文 中使用不同于操作 A 的聚合
  4. 操作 B 在不同于操作 A 的有界上下文中执行。

Preda 将场景 3 和 4 关联到领域驱动设计(DDD),他相信在这两种场景中选择最终一致性将引导到比使用传统事务工作更好的设计。领域事件在这里可以很有用。领域事件是在领域专家相关的领域中发生的某些事情的代表,它们通过作为触发器启动工作流的下一个步骤和承载领域信息需求来促进最终一致性。

写同一主题的 Mike Mogosanu 声称在现实世界的用例中 事务型一致性工作流很罕见;一个业务流程经常包含一系列的用例和使用 Unit of Work (UoW) 模式去持久化一组更改,从技术观点来看,它幼稚的解决方案会将事情复杂化,尤其是在分布式应用中。

Mogosanu 相信一个包含不同有界上下文的业务流程应该考虑变为最终一致性,其在每个有界上下文中有最少一个领域用例。领域用例负责让聚合保持始终如一,在这里 UoW 模式会很有用,而且公布触发其它用例启动的领域事件,最终可以把整个系统带到一致的状态。

为了举例说明他的想法,在实现用 Azure Service Bus 消息系统来做事件传送的 C# 应用 中,Preda 使用了 Vaughn Vernon 在书本 实现领域驱动设计 中提到的设计的一个简化版本。

查看英文原文: Domain Events and Eventual Consistency


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-10-08 19:005665

评论

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

中原银行:基于StarRocks构建OLAP全场景架构解决方案,迈入极速统一时代

StarRocks

数据库

写个JS深拷贝,面试备用

helloworld1024fd

JavaScript

Qt | 本地存储配置信息 QSettings

YOLO.

qt 10月月更 C++

Qt示例 | 模拟时钟示例 Analog Clock Example

YOLO.

qt 10月月更 C++

中软鸿联:集聚智能化能量势场,点燃小家电创新星火

中软国际AIoT开发者社区

智慧家电

MySQL高级--性能优化之慢日志查询

Java学术趴

10月月更

公网对讲SDK| 快速搭建公网对讲应用

anyRTC开发者

音视频 监听 快对讲 AI降噪 录音

喜迎华诞,openEuler 22.09 正式发布,与1265名开发者共建面向数字基础设施的开源操作系统

openEuler

开源 开源操作系统 open Euler

云原生时代的DevOps平台设计之道

北京好雨科技有限公司

KMP算法的实现详解

lovevivi

c 数据结构 10月月更

开源云原生平台对比 KubeSphere vs Rainbond

北京好雨科技有限公司

全息投影正在威胁LED显示屏在舞台的地位

Dylan

LED显示屏 led显示屏厂家

一条 SQL 语句是如何执行的

说故事的五公子

MySQL 数据库 sql

开奖啦!看看 9 月月更获奖名单有没有你?

InfoQ写作社区官方

热门活动

ctk流程

留白的艺术

大学毕业后转行软件测试我后悔了

测吧(北京)科技有限公司

测试

手撕常见JS面试题

helloworld1024fd

JavaScript

NFT 数据基础设施 NFTScan 的产品介绍【科普】

NFT Research

区块链 NFT 数据基础设施

直播预告|Apache APISIX x KubeSphere 在线 Meetup 来袭

API7.ai 技术团队

APISIX KubeSphere

kubernetes为什么会火?为什么值得我们学习?

王中阳Go

Kubernetes k8s 容器编排 10月月更 动态扩缩

数据结构学习,串篇(顺序串及算法)

IC00

学习 数据结构 算法 学习笔记 10月月更

从零开始实现一个Promise

helloworld1024fd

JavaScript

2022互联网母婴行业用户洞察

易观分析

互联网 母婴

真机调试设备不够?荣耀云调试帮你忙

荣耀开发者服务平台

开发者 手机 云服务 荣耀 honor

C# ref用法,实现引用传递(地址传递)

IC00

C# 学习 程序员 上位机 10月月更

基于纯前端类Excel表格控件实现在线损益表应用

葡萄城技术团队

前端 Excel 报表

MASA Framework的异常处理

MASA技术团队

.net MASA Framewrok MASA

中软鸿联:数字为运动蓄能,智能为健康充值

中软国际AIoT开发者社区

智能穿戴 运动健康

故障复盘究竟怎么做?美图SRE结合10年经验做了三大总结(附模板)

TakinTalks稳定性社区

运维 SRE SRE实践

行业大咖秀,第二期开播!

云计算

【数据结构之红黑树】深入原理与实现

C++后台开发

数据结构 后端开发 红黑树 linux开发 C++开发

领域事件与最终一致性_语言 & 开发_Jan Stenberg_InfoQ精选文章