写点什么

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

评论

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

什么是低代码开发平台?浅谈它的价值

高端章鱼哥

低代码 aPaaS JNPF

智能制造之路—从0开始打造一套轻量级MOM平台

EquatorCoco

数字化 智能制造

MQTT 订阅选项的使用

EMQ映云科技

mqtt 订阅选项

语音聊天app源码中,技术性和功能性并存,技术和功能层面的细节考虑有哪些?

山东布谷科技胡月

语音聊天APP源码 语音直播app开发 国际多语言设计app开发 语音社交平台搭建

如何成为网络安全大牛(黑客)?

网络安全学海

黑客 网络安全 信息安全 计算机 渗透测试

使用 Postman 批量发送请求实用教程

Liam

Java 后端 开发 Postman API

五种高级 NodeJS 技术

互联网工科生

node.js nodejs

java面试题-多线程

程序员小张

打造工业互联网平台,强化“腰部”支撑,助力实现国产替代

用友BIP

国产替代

构建网站利器!体验高速稳定的香港云主机服务!

一只扑棱蛾子

云主机 香港云主机

混战源起ChatGPT,中国的AI产业怎么样了? | 社区征文

向阳花

人工智能 AI 马斯克 前沿技术 年中技术盘点

简化办公,云上助力!

知者如C

【网易云信】直播场景播放侧常见问题分析与实践经验

网易云信

直播 实时音视频 音视频开发 直播推流

软件测试/测试开发丨Linux 三剑客与管道使用

测试人

Linux 程序员 软件测试

4种大文件传输的方式?适用设计类企业的文件传输方法

镭速

大文件传输

汽车软件的模糊测试

DevOps和数字孪生

软件定义汽车

Python案例实现|爬取租房网站信息

TiAmo

Python 数据分析

点云标注在自动驾驶中有着广泛的应用案例

来自四九城儿

【网易云信】直播场景播放侧常见问题分析与实践经验

网易智企

直播 实时音视频 直播推流 音视频技术

柏睿数据作为湖仓一体数据平台代表厂商入选IDC报告

新消费日报

揭秘|来看看袋鼠云数栈内部的资产血缘方案设计与实现

袋鼠云数栈

数据资产 数据血缘

模块八 消息队列mysql存储表结构设计

家有两宝

#架构训练营

【参考设计】100 W USB PD 3.0电源

元器件秋姐

设计 电路 方案 usb 电源

如何使用 NFTScan SDK 工具构建 NFT Explorer Dapp

NFT Research

NFT\ SDK 教程

DevSecOps:软件安全捍卫者

DevOps和数字孪生

DevSecOps

携手生态共筑数智底座,加速企业数智化转型

用友BIP

数智底座

软件测试/测试开发丨Python 面向对象编程思想

测试人

Python 编程 面向对象 软件测试

得物 Android 包体积资源优化实践

得物技术

前端 用户体验 SEO

EDS从小白到专家丨打造你的专属“数据物流”系统

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

成都站|阿里云 Serverless 技术实战营邀你来玩!

Serverless Devs

云计算 负载均衡 Serverless 云原生 弹性计算

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