写点什么

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

评论

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

MTK 2.9.2 迁移Oracle 11g 至 openGauss 5.0.0操作指南

daydayup

【我和openGauss的故事】可视化运维平台openGauss Datakit带你轻松玩转openGauss 5.0

daydayup

Gartner 首发中国数据分析与人工智能技术成熟度曲线,TDengine 入选

爱倒腾的程序员

盘点一对一直播源码的那些小功能

山东布谷网络科技

源码 社交APP 一对一直播

【我和openGauss的故事】带有out参数的存储过程及自定义函数的重载测试

daydayup

【我和openGauss的故事】 openGauss 5.0.0 事务相关语法

daydayup

倒计时2天 | 第六届openGauss技术文章征集活动最新初审合格名单(截至8.3)

daydayup

行业信创-太极信创研习院第36期ITAIP信创精华班央企专场培训在京成功举办

电子信息发烧客

C与C++之间的相互调用及函数区别

芯动大师

简单好用的ElasticSearch可视化工具:es-client和Head

javalover123

搜索引擎 elasticsearch ELK ES Elastic Search

[腾讯云 Cloud studio 实战训练营] 制作Scrapy Demo爬取起点网月票榜小说数据

ベ布小禅

在 Go 语言单元测试中如何解决 Redis 存储依赖问题

江湖十年

后端 单元测试 Go 语言 redis'

【我和openGauss的故事】openGauss 5.0.0企业版x86单机安装

daydayup

山东布谷科技详解Android端直播应用源码保持优质直播质量的技术(三):可变比特率

山东布谷科技

android 软件开发 源码搭建 直播应用源码 可变比特率

纵览 PoseiSwap 经济体系,如何从宏大的叙事中持续捕获价值?

股市老人

图数据库使用及业务场景

小小怪下士

Java MySQL 数据库

openGauss数据库源码解析系列文章—安全管理源码解析(五)

daydayup

【我和openGauss的故事】使用Ora2Pg迁移oracle数据到openGauss

daydayup

仪表板修改优化实操案例

搞大屏的小北

数据看板 大屏布局 大屏设计 大屏设计优化 数据看板优化

5个高并发场景优化的衡量指标

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 8 月 PK 榜

纵览 PoseiSwap 经济体系,如何从宏大的叙事中持续捕获价值?

小哈区块

HDC 2023 | HarmonyOS应用联运服务,帮助开发者实现全链路经营提效

极客天地

再获殊荣!AlphaSights荣获猎聘“2022年度非凡雇主”称号

科技热闻

openGauss数据库源码解析系列文章—安全管理源码解析(五)

daydayup

华为发布数字资产继承功能

HarmonyOS SDK

华为 HarmonyOS HMS Core

Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫

java易二三

Java 程序员 爬虫 计算机 电脑

【我和openGauss的故事】为集群增加VIP

daydayup

程序员如何利用AI加持

Bruce Talk

AI 敏捷开发

9. 数据类型 - 列表详解

茶桁

Python

父子线程共用线程池

soap said

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