写点什么

领域事件与最终一致性

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

评论

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

2022年金三银四Java面试宝典,横扫春招+社招+秋招

程序员啊叶

Java 编程 程序员 架构 java面试

2022备战秋招10W字面试小抄pdf版,附操作系统、计算机网络面试题

程序员啊叶

Java 编程 程序员 架构 java面试

AIRIOT答疑第6期|如何使用二次开发引擎?

AIRIOT

二次开发 物联网低代码平台

面试好难啊!蚂蚁金服的六轮面试我是强撑过来!差点OUT(面试复盘)

程序知音

Java 阿里 程序员面试 BAT面试题 八股文

Redis网红高频面试题三连:缓存穿透?缓存击穿?缓存雪崩?

程序员啊叶

Java 编程 程序员 架构 java面试

技术分享| 快对讲综合调度系统

anyRTC开发者

音视频 指挥调度 快对讲 语音对讲 视频对讲

建木持续集成平台v2.5.2发布

Jianmu

持续集成 低代码 CI/CD gitops

搞定RocketMQ这二十三点,大厂面试稳了

王小凡

Java 数据库 程序员 面试 大厂面试

【微信小程序】项目实战—抽签应用

flow

签约计划第三季

如何让个性化推荐即刻触达?云原生数据库GaussDB(for Redis)来助力

华为云开发者联盟

数据库 云原生 后端

从存储角度看自动驾驶必经之路

焱融科技

人工智能 自动驾驶 存储 文件存储 分布式文件存储

浅谈AI深度学习的模型训练和推理

GVision

图的遍历的定义以及深度优先搜索和广度优先搜索(二)

乔乔

7月月更

如何查看蓝牙耳机的蓝牙版本

贾献华

7月月更

怎么会不喜欢呢,CI/CD中轻松发送邮件

Jianmu

持续集成 低代码 邮件 通知

深度 | 自动驾驶数据服务进入2.0时代

澳鹏Appen

人工智能 自动驾驶 计算机视觉 智能驾驶 激光雷达

兆骑科创海内外引进高层次人才,创新创业项目对接

兆骑科创凤阁

4 轮拿下字节 Offer,面试题复盘

程序员啊叶

Java 编程 程序员 架构 java面试

字节跳动Java研发面试99题(含答案):JVM+Spring+MySQL+线程池+锁

程序知音

Java 字节 程序员面试 后端技术 八股文

如何对话CIO/CTO

凌云Cloud

销售 企业管理系统 CIO To B业务

知识管理系统推动企业信息化发展

Baklib

施耐德电气、欧莱雅等企业巨头如何开放式创新?DEMO WORLD世界创新峰会揭秘

创业邦

1000个字带你一次性搞懂JavaAgent技术,反正我是彻底服了

程序员啊叶

Java 编程 程序员 架构 java面试

带来高价值用户体验的低代码开发平台

力软低代码开发平台

怎样实现文档协同?

Baklib

收藏!0 基础开源数据可视化平台 FlyFish 大屏开发指南

云智慧AIOps社区

大前端 低代码 开源项目 数据可视化工具 开源推荐

美团二面:为什么Redis会有哨兵?

王小凡

Java redis 编程 程序员 开发

GIS数据漫谈(五)— 地理坐标系统

ThingJS数字孪生引擎

Spring Cloud 架构

Damon

7月月更

低代码实现探索(四十五)业务参数

零道云-混合式低代码平台

技术实践干货 | 初探大规模 GBDT 训练

观远数据

人工智能 机器学习

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