产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

从事件和 DDD 入手来构建微服务

  • 2017-01-08
  • 本文字数:1343 字

    阅读完需:约 4 分钟

领域驱动设计(Domain-Driven Design,DDD)是一项很伟大的技术,它拉近了设计与程序实际所服务的领域,但是通常我们会关注结构,从而太早地做出决策,这并非DDD 的本意。相反,在领域中,我们应该从事件开始, Russ Miles 描述了在构建微服务时,采用“事件优先”的方式所具有的优势

Miles 认为除了关注结构之外,我们还过多地关注了通用语言(ubiquitous language),尤其是在领域对象方面更是如此。更糟糕的是,我们还会着手创建一些跨领域边界重用的库,这些库中包含了领域对象,这实际上阻碍了不同边界上下文(bounded context)的独立演化。

在Miles 的经验中,对于企业级分层架构来说,这种方式已经成为了默认的架构风格,这么做的原因在于它能够让事情变得更容易,而不是更简洁或者有助于提升设计。这样做会带来一定的问题,比如实体变成了通用的,从只位于某个上下文之中变成了跨所有上下文的规范,这是与DDD 的理念背道而驰的。

与上面提到的做法不同,Miles 宣称我们首先要从领域中发生了什么入手,也就是事件。在领域中,它们能够更好地捕获通用语言,通常也是描述领域的最简单的方式,尤其是在跟领域专家合作的时候更是如此。他发现无论是构建新的系统还是演化已有的系统,这种方式都非常适用。

Miles 主张在使用事件时,第一步是事件风暴(Event Storming),这是由 Alberto Brandolini 所创建的一项建模工作坊技术。其基本理念就是通过领域中所发生的事情(也就是领域事件)来探索这个领域,并且使用便签来描述领域中的事件,这些便签会沿着时间轴贴到一个很大的建模面板上。举例来说,能够引发事件的事情包括用户行为、外部系统所发生的事情以及时间的流逝。事件也有助于找到领域的边界,对术语的不同阐述可能就意味着存在边界。

对 Miles 来说,另外一个导致复杂性的地方在于为错误的工作任务使用错误的模型。针对状态的持久化,DDD 提供了 repository 模式,通常的做法是在读取和写入方面,使用相同的模型。这种方式带来的一个好处就是一致性,但是如果需求稍微有所差别,那么将读取和写入通过不同的模型进行分离将会取得明显的收益。

命令查询职责分离(Command Query Responsibility Segregation,CQRS)就是一种实现这种分离的技术:

事件溯源(Event sourcing)是对CQRS 的自然扩展,在这里聚集产生的所有事件都会进行持久化,可以用来重新创建聚集的状态,而不是存储状态本身。按照Miles 的说法,这种能力可以重建状态,是一种降低状态脆弱性的方法。

CQRS 以及事件溯源会带来其他的复杂性,比如最终一致性(eventual consistency) ; Greg Young 是 CQRS 这个术语的创造者,他也对如今的事件溯源很感兴趣,他认为这两者都不是顶层的结构(top-level architecture)。按照 Young 的说法,它们只能有选择地应用于某些地方,他强调整个系统都基于事件溯源构建是一种反模式。

查看英文原文 Start with Events and DDD When Building Microservices

2017-01-08 18:003548

评论

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

Beyond Compare 4 for Mac v4.4.7(28397)中文版下载

iMac小白

软件测试/测试开发/人工智能丨ROC 与 AUC 的含义

测试人

人工智能 软件测试

Java后端问题排查经验

WizInfo

软件测试/测试开发/人工智能丨如何通过分组 AUC 从不同的维度验证模型的能力

测试人

人工智能 软件测试

针对海量数据的存储与访问瓶颈的解决方案

快乐非自愿限量之名

数据 数据化 仓库

JProfiler for Mac:跨平台兼容性,适用性广泛

iMac小白

MatrixOne 通过中国信通院 “可信数据库” HTAP 基础能力专项测试

MatrixOrigin

分布式数据库 云原生数据库 MatrixOrigin MatrixOne HTAP数据库

IPQ6010 vs IPQ9574 Platform Comparison|Achieve 1588 TSN in WiFi6 WiFi7Hardware

wallyslilly

IPQ6010

测试开发 | 智能农业引领农业革新,人工智能携手农业改写未来

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

测试

英特尔成为openEuler社区黄金捐赠人,共建最具创新的开源社区

彭飞

面试官问我:线程锁导致的kafka客户端超时,如何解决?

华为云开发者联盟

开发 华为云 华为云开发者联盟 线程锁

矩阵起源荣获"深圳企业创新(国际)纪录"殊荣

MatrixOrigin

分布式数据库 云原生数据库 MatrixOrigin MatrixOne HTAP数据库

GO编程语言:简洁、高效、强大的开源编程语言

EquatorCoco

Go 编程语言 架构编程

软件测试/测试开发/人工智能丨分类,二分类和回归问题的对应场景与区别

测试人

人工智能 软件测试

如何给图数据库 NebulaGraph 新增一种数据类型,以 Binary 为例

NebulaGraph

数据库

大模型应用产品「归一妙计」亮相,AI Agent落地广告投放场景

武凯说

人工智能 领域模型 GPT 营销自动化 全媒体广告投放代理、

简述SD-WAN组网的五大技术优势

Ogcloud

网络 网络加速 SD-WAN 组网

整体模块化区块链技术引领区块链大规模采用

区块链软件开发推广运营

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

测试开发 | 保护数据隐私的分布式学习方法:构建安全智能未来

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

测试

汽车行业数字化转型,迎来新机遇!

优秀

数字化转型 汽车行业 汽车行业数字化转型

关于业务转化息息相关的小程序能力

Geek_2305a8

外贸企业如何搭建适合自己的B2C外贸出口独立站

tbapi

淘宝代购系统 淘宝代购 淘宝代采系统 华人代购 华人代购系统

企业如何通过全面预算管理优化业务流程

智达方通

业务流程优化 业务流程 全面预算管理

测试开发 | AI在人工和服务领域的崭新角色

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

测试

浅聊PAM市场价值

尚思卓越

运维 网络安全

活动 | Mint Blockchain 赞助支持清迈 WAMOTOPIA 线下活动

NFT Research

blockchain NFT L2

武汉 Linux 爱好者线下沙龙:WHLUG 2023 收官!不容错过!

nn-30

Linux 技术交流 线下沙龙 WHLUG LUG

演讲回顾:半导体设计中的数字资产管理最佳实践

龙智—DevSecOps解决方案

数字资产管理

Taobao purchasing system丨Taobao purchasing system丨Chinese purchasing system丨Chinese goods purchasing

tbapi

taobao agent taobao agent system 1688 agent 1688 agent system taobao buyer

测试开发 | AI与生物医学:加速医学研究的新引擎

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

测试

MongoDB与大数据处理:构建高性能分布式数据库

互联网工科生

mongodb 非关系型数据库

从事件和DDD入手来构建微服务_语言 & 开发_Jan Stenberg_InfoQ精选文章