最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

从事件和 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:003437

评论

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

ECS 选款利器!PTS助您快速上云!

阿里巴巴云原生

活动 ECS TPS

Flutter 对状态管理的认知与思考

小呆呆666

flutter ios android 大前端 dart

如何实现一款毫秒级实时数据分析引擎

Shopee技术团队

大数据 数据分析 后端 HBase

网络攻防学习笔记 Day147

穿过生命散发芬芳

风险评估

Morphling:云原生部署 AI , 如何把降本做到极致?

阿里巴巴云原生

阿里云 AI 云原生 Morphling

考试系统高并发试卷存储设计方案

Imaginary

华为云GaussDB(for MySQL)2.0全新升级,三大技术大揭秘

华为云开发者联盟

数据库 云原生 GaussDB GaussDB(for MySQL) 华为全联接2021

多租户是什么意思?怎么理解?

行云管家

云计算 运维 SaaS

从敏捷开发到全自动开发,加速实现企业数字化转型

SoFlu软件机器人

华为云开天aPaaS 上线,服务千万开发者,使能行业场景化创新

华为云开发者联盟

华为云 企业应用 开天aPaaS aPaaS 华为云生态

Python代码阅读(第28篇):计算列表中位数

Felix

Python 编程 Code Programing 阅读代码

等保是强制的吗?企业不办等保有啥处罚?

行云管家

网络安全 等保 等保2.0

linux之mktemp命令

入门小站

Linux

Intel高管披露Arc显卡合作厂商?官方否认

科技新消息

Intel要跟华硕等OEM品牌推出DG2显卡?官方:消息不属实

科技新消息

Linux用户/用户组编辑

在即

9月日更

Java变异出现错误:No enclosing instance of type XXX is accessible

华为云开发者联盟

Java

架构实战营 - 模块四作业

Alex.Wu

Spark 系列教程(1)Word Count

Se7en

送你一个Python 数据排序的好方法

华为云开发者联盟

Python 数据分析 数据排序

【墨天轮专访第五期】偶数科技常雷:创新改变世界,深耕云数据仓库

墨天轮

数据库 国产数据库

25. 自动驾驶:AI最大的应用场景

数据与智能

人工智能

书单 | 带你轻松度假的10本好书!

博文视点Broadview

一文教你如何落地spring cloud alibaba企业级架构

小鲍侃java

后端 引航计划

滴滴 x StarRocks:极速多维分析创造更大的业务价值

StarRocks

数据库 数据分析 滴滴 Clickhouse StarRocks

Prometheus 2.27.0 新特性

耳东@Erdong

release Prometheus 9月日更

Go 中五个常见错误

baiyutang

golang 9月日更

Chrome浏览器控制台支持中文

FunTester

chrome 浏览器 控制台 FunTester 中文

你知道怎么离线安装全局 node 模块吗?

编程三昧

大前端 npm Node 离线包 9月日更

缓存的弊端,你了解吗

卢卡多多

缓存 9月日更

在线Emoji符号大全

入门小站

工具

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