NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

领域事件与最终一致性

  • 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:005083

评论

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

ACK One:构建混合云同城容灾系统

阿里巴巴云原生

阿里云 Kubernetes 云原生

基于Java开发的工作流管理系统,快速开发平台

金陵老街

电商“变法”,AI维新

脑极体

AI

数字化商品管理:革新鞋服零售模式,引领智能商业新时代

第七在线

极速提升测试效率:揭秘Web自动化三大等待技巧

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

测试

跨境电商企业都在用的云手机是什么?

Ogcloud

云手机 海外云手机 云手机海外版 国外云手机 电商云手机

思码逸企业版 4.0 特性之一:支持 DevOps 全工具链数据分析

思码逸研发效能

C# 12 中新增的八大功能你都知道吗?

EquatorCoco

.net C语言 开发语言

在script标签写export为什么会抛错|type module import ES5 ES6 预处理 指令序言 JavaScript JS

Geek_ee6d52

前端 JavaScrip

思码逸企业版 4.0 特性之二:支持 DevOps 全工具链数据分析

思码逸研发效能

oracle和mysql语句有哪些异同点?

伤感汤姆布利柏

玩转 Go Slices 切片泛型库

陈明勇

Go golang 后端 go slices

海外云手机在电商平台的用途

Ogcloud

云手机 海外云手机 云手机海外版 国外云手机 电商云手机

收藏!如何有效实施DevOps?

敏捷开发

项目管理 DevOps 运维 单元测试 #后端

IPQ9574/Breaking the speed boundary: exploring the innovative technologies of WiFi 7

wallysSK

以太坊 Dencun 升级与潜在机会

TechubNews

Ethereum 区块链、 #Web3

Python可视化工具集合来报道(下)

小齐写代码

想要一个龙年头像,在线等挺急的

阿里巴巴云原生

阿里云 云原生 函数计算 Stable Diffusion

面试官:如何实现10亿数据判重?

王磊

Java 面试题

无缝对接,提升企业办公与薪酬福利管理效率!

聚道云软件连接器

案例分享

NFTScan | 02.12~02.18 NFT 市场热点汇总

NFT Research

NFT NFT\ NFTScan

全彩LED显示屏选购指南

Dylan

产品 LED显示屏 全彩LED显示屏 led显示屏厂家

为什么单元测试不是持续交付的唯一答案

敏捷开发

项目管理 DevOps CI/CD 测试 单元测试 产品研发

命名虚拟机及设置安装路径

小魏写代码

Go 1.22 slices 库的更新:高效拼接、零化处理和越界插入优化

陈明勇

Go golang 后端 Go 1.22

一站式指南:ClkLog部署环境配置指南

ClkLog

信息茧房的困境

老张

信息茧房 sora

区块链软件开发:创新、安全、智能的数字未来

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

DevData Talks | 金融大咖说:金融企业如何持续提升研发效能

思码逸研发效能

利用大数据和API优化电商决策:商品性能分析实践

Noah

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