写点什么

领域事件与最终一致性

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

评论

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

最基础的3道java面试题,你真的答得上来吗

田维常

面试

云话题 | 第3期 你女朋友在买买买时,程序员小哥在干嘛?

阿里云Edge Plus

CDN 直播 直播带货

点赞系统软件开发

luluhulian

疫情成本遭不住?一招降本85%,架构特性全部公开!

数据君

运动健身市场越来越大,你的客户却越来越少?

IoT云工坊

人工智能 App 物联网 健身房 智能健身房

面试杀手锏!2021最新Android常用开源库总结,Android校招面试指南

欢喜学安卓

android 程序员 面试 移动开发

面试看这个就够了!6年菜鸟开发面试字节跳动安卓研发岗,学习路线+知识点梳理

欢喜学安卓

android 程序员 面试 移动开发

字节面试太刁钻了:不加机器,怎么提升系统并发100倍

Java架构师迁哥

new的过程是怎样的?看完这一篇就懂了

codevald

Java JVM原理 面向对象编程 类对象

如何避免让微服务测试成为研发团队最大的瓶颈?

阿里巴巴中间件

DIY一款能随周围环境变化的智能灯泡,求婚必备!

IoT云工坊

人工智能 物联网 人脸识别 sdk IoT App

软件架构模式之事件驱动架构

架构精进之路

软件架构 七日更 28天写作 2月春节不断更

第三周

ALone

滴滴 Flink-1.10 升级之路

Apache Flink

flink

疫情又反扑,除了不乱跑,我们还能干点啥?

数据君

GraphX 在图数据库 Nebula Graph 的图计算实践

NebulaGraph

图数据库 图数据库实战

话题讨论 | 你现在还会推荐亲朋做程序员吗?

石云升

话题讨论 2月春节不断更

勿让 Docker Volume 引发 Terminating Pod

黄久远

Docker 云计算 Kubernetes 容器 云原生

k8s-client-go源码剖析(三)

远鹏

Kubernetes Kubernetes源码 Go 语言

Linux-Lab 入门:体验

贾献华

Docker Linux 嵌入式 内核 Lab

2020-21《全球质量报告》解读

BY林子

质量保障 质量赋能 敏捷测试

LeetCode题解:69. x 的平方根,二分查找,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

CodeDay#5 全程回顾——一场关于动态化开发实践的技术探讨

蚂蚁集团移动开发平台 mPaaS

mPaaS Codeday 技术沙龙

【内含福利】流行在CDN圈内的黑话有哪些?

阿里云Edge Plus

CDN

List去除重复数据的五种方式

xcbeyond

Java ArrayList 28天写作

这只猫在云端定居了?边缘计算在天猫精灵云应用上的落地实践

阿里云Edge Plus

CDN IoT 边缘计算 云桌面

MySQL字段类型最全解析

Simon

MySQL 数据库数据类型

领域的边界,一个小讨论

李小腾

领域驱动设计 DDD

Elasticsearch 从 0 到千万级数据查询实践

📿

Java spring elasticsearch Spring Cloud spring data

单例模式原来是这么简单?!

后台技术汇

28天写作 2月春节不断更

2020已过,2021来临,iOS 开发市场如何?一切都是未知!【未来可期】

ios 程序员

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