写点什么

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

评论

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

LLAMA预训练:大模型的潜力与挑战

百度开发者中心

人工智能 深度学习 大模型

科学启智,AI赋能:AI for Science塑造多学科研究新范式

飞桨PaddlePaddle

人工智能 开发者 AI for Science WAVE SUMMIT

万界星空科技铜线MES、漆包线MES系统

万界星空科技

生产管理系统 智能制造 mes 漆包线mes 铜线mes

万界星空MES系统的十大核心功能

万界星空科技

数字化转型 MES系统 智能制造 mes 万界星空科技mes

只需一个bitget钱包,让你的web3体验翻倍

鳄鱼视界

得物商家域精准测试实践

得物技术

测试

软件测试/测试开发丨名企私教服务加盟全栈开发与自动化测试班

测试人

人工智能 软件测试

软件测试/测试开发 | 测试开发线下高薪私教班助力你的职场晋升

测试人

人工智能 软件测试

IPQ8074/IPQ8072 What's the performance difference?|8X8 4X4 High Performance 802.11ax Solution

wallyslilly

IPQ8072 IPQ8074

软件测试/测试开发|测试开发线下高薪私教班助力你的职场晋升

霍格沃兹测试开发学社

如何优化 RAG 系统的性能表现?10 条实用策略

Baihai IDP

深度学习 程序员 AI 白海科技 rag

如何将 Python 项目打包成 exe,另带卸载功能!

北桥苏

Python GUI pyinstaller tkinter Inno Setup Compiler

人工智能与测试开发自动化沙龙(PPT和回放集锦)

霍格沃兹测试开发学社

解析$nextTick魔力,为啥大家都爱它?

京东科技开发者

如何通过ETLCloud的API对接功能实现各种SaaS平台数据对接

RestCloud

SaaS API ETL

《环太平洋》流浪者机甲3D模型特效还原

3D建模设计

3D渲染 材质纹理贴图 3D材质编辑

云原生技术:实践探索与未来展望

不会算法。

XSKY SDS V6.3 版本发布:持续强化非结构化存储和管理能力

XSKY星辰天合

只需一个bitget钱包,让你的web3体验翻倍

威廉META

法线贴图实现衣服上皱褶特效

3D建模设计

3D渲染 材质纹理体贴 3D材质编辑

法线贴图实现地形模型皱褶、凹凸不平的纹理效果

3D建模设计

3D渲染 材质纹理贴图

GLTF/GLB模型在线预览、编辑、动画查看以及材质修改

3D建模设计

3D渲染 材质纹理贴图 3D材质编辑

京东商品评论数据接口(JD.item_review)

tbapi

京东API接口 京东商品评论接口 京东商品评论内容接口 京东评论API接口

一分钟带你了解人工神经网络(ANN)

小齐写代码

个人年度总结:大模型驱动技术的趋势洞察

Geek-yan

IPQ6010 vs. IPQ4019: The battle of Qualcomm chips and WIFI 6 vs WIFI 5

wallysSK

大模型微调:适应新任务的强大工具

百度开发者中心

深度学习 大模型 Prompt

Fine-Tuning: 精调大模型训练的关键步骤

百度开发者中心

大模型

瑶池数据库Serverless+AI训练营开营啦,参营享千元好礼

阿里云瑶池数据库

数据库 Serverless 阿里云; 阿里云瑶池数据库

开放原子开发者大会 | 开源就是国际化,华为大力推动开源社区建设

新消费日报

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