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

领域驱动设计(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)就是一种实现这种分离的技术:

  • 命令作用于写入模型上,并且要以一致的方式进行修改,最好是在一个聚集(aggregate)上,它会产生一个或多个事件。Miles指出所创建出来的事件并不是副产品,它们是命令的实际结果。

  • 查询使用一个或多个读取模型,针对查询会进行一些优化。写入模型所生成的事件会被读取模型接受到,读取模型会进行更新,从而反映写入模型的状态。

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

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

原文地址:http://www.infoq.com/cn/news/2017/01/microservices-events-ddd


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JTA 深度历险 - 原理与实现

转载自 JTA 深度历险 - 原理与实现 利用 JTA 处理事务 什么是事务处理 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。关于事务最经典的示例莫过于信…

为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]

ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只是一个很轻量级的框架,但是在大部分情况下能够满足我们的需要。不过我觉得它最缺乏的是针对AOP的支持,虽然这个依赖注入框架提供了扩展点使我们可以很…

装箱VS拆箱

我们一般将“基本数据类型转换成包装类”的过程叫做装箱,将“包装类转换成基本数据类型”的过程叫做拆箱。 装箱可以分为手动装箱和自动装箱: 拆箱也可以分为手动拆箱和自动拆箱:

事务模型与分布式事务总结思考

转载自 事务模型与分布式事务总结思考 1. 介绍 之前了解过一些分布式事务处理的思想,包括MVCC、TCC等。但是对具体实现的规范和约束还不够理解清晰。本文从事务模型分类来讨论常见的事务模型。事务模型的含义,应该指的是我们如何去使用可控制事务。 首…

我的这10年——从机械绘图 到 炼油 到 微软MVP 的华丽转身

年底了,各种总结计划满天飞,有空的时候我也一直在思考这么多年,是怎么过来的。也曾经很迷茫,希望经验和经历能给大家一点带来一点正能量的东西。10年很长,10年前说实话我没有思考过现在的样子,但10年前的日…

基本类型和字符串互相转换

将基本数据类型转换成字符串 将字符串转换成基本数据类型

C#如何使用ES

Elasticsearch简介 Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定、可靠、快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的。 Elasticsearch是什么 Elasticsearch是一个基于Apache Luc…

springboot中配置mybatis连接postgresql

https://blog.csdn.net/y_qc_lookup/article/details/80178545 springboot中配置mybatis连接postgresql 置顶 Dylans 2018-05-03 15:49:46 41415 收藏 8 分类专栏: java 文章标签: springboot mybatis postgresql xml 版权 最近在使用springboot用于…

CoreCLR源码探索(二) new是什么

前一篇我们看到了CoreCLR中对Object的定义,这一篇我们将会看CoreCLR中对new的定义和处理new对于.Net程序员们来说同样是耳熟能详的关键词,我们每天都会用到new,然而new究竟是什么? 因为篇幅限制和避免难度跳的太高,这一…

asp.net core 认证及简单集群

众所周知,在Asp.net WebAPI中,认证是通过AuthenticationFilter过滤器实现的,我们通常的做法是自定义AuthenticationFilter,实现认证逻辑,认证通过,继续管道处理,认证失败,直接返回认…

Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】

第一次自学springmvc的时候&#xff0c;老是报错Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]&#xff0c;郁闷的不要不要的。按照配置规则重新检查了一遍&#xff0c;没看出问题来&#xff0c;上网搜了一下说在web.xml里面加入: <servlet>…

成小胖学习微服务架构·基础篇

看到最近“微服务架构”这个概念这么火&#xff0c;作为一个积极上进的程序猿&#xff0c;成小胖忍不住想要学习学习。而架构师老王&#xff08;不是隔壁老王&#xff09;最近刚好在做公司基础服务的微服务化研究和落地&#xff0c;对此深有研究。 于是成小胖马上屁颠屁颠的跑过…

JDBC连接数据库教程,postgreSQL

https://blog.csdn.net/jg15617651654/article/details/63262456/ JDBC连接数据库教程&#xff0c;postgreSQL 流年你奈我何 2017-03-18 17:17:43 17389 收藏 4 分类专栏&#xff1a; Postgres 修炼之道 文章标签&#xff1a; postgresql 数据库 事务 jdbc 版权 0、概述 …

Springmvc入门案例(1)

据说&#xff0c;现在springmvc火了&#xff0c;好多企业都在使用&#xff0c;既然这样&#xff0c;咱们也得会点&#xff0c;于是乎就开始自学了&#xff0c;通过找资料&#xff0c;终于做出来了一个简单案例&#xff0c;这里分享供大家浏览&#xff0c;主要分为以下几个步骤&…

微软Project Springfield团队的F#使用心得

Project Springfield是一个用于在软件中查找关键安全错误的模糊测试服务。微软Springfield团队首席软件工程经理William Blum介绍了他们团队如何利用F#来构建云服务。 简洁性经常被认为是F#的主要优点之一。Blum提供了一些Project Springfield相关的数据&#xff1a; 为了移除一…