分布式系统中的解耦模式:隔离事件层 - mathiasverraes

栏目: 后端 · 发布时间: 5年前

内容简介:这是使用可见性层明确分离不同有界上下文的事件,可以使用它们自己的语言。

这是 mathiasverraes 领域事件系列文章最后一篇,其他可点击#领域事件 进入查看!

使用可见性层明确分离不同有界上下文的事件,可以使用它们自己的语言。

问题

这个问题与显式公共事件中描述的相同:有时将某些事件标记为公开是不够的,您可能确实需要独立演进内部的事件,同时以不同方式设计公共事件以适应外部客户端。客户端可能需要概要事件或胖事件,但您不希望在满足所有这些消费者客户端需求的情况下却使得你自己的有界上下文内部变得变得混乱。

还有一个问题是,如果太多的消费者将他们的需求强加给生产者,并且所有消费者都依赖于相同的事件,那么消费者在逻辑上会彼此耦合。

解决

保持所有内部事件严格保密,设置一个侦听内部事件的适配器,并针对不同客户端消费者发出不同的公共事件的新流。我们也可以为每个消费者设置一个单独的适配器和流,以高度适应他们的不同需要。

新事件流实际上是一个位于我们所处的不同的有界上下文里:这些事件流有自己的语言、事件类型和名称。这样就可以通过构建反腐败层进行事件的隔离,这也是防腐层的一个实现模式。

有些名称可能与原来的有界上下文中的名称重叠或冲突,但这很好:拥有在本地定义概念而不尝试全局定义概念的自由,这正是我们使用有界上下文的原因。

案例

在私有层中,我们发出:

OrderWasInitiated {orderId}
LineItemWasAdded {orderId, productId, quantity}
OrderWasPlaced {orderId, customerId}
StockWasReserved {orderId, stockId}
TransportWasBooked {transportId, orderId}
OrderWasPacked {orderId}
OrderWasShipped {orderId} 

适配器是一种监听这些事件的Projector,并为公共消费发出新流:

OrderWasPlaced {orderId, customerName, lineItems}
OrderWasConfirmed {orderId, customerName, lineItems}
OrderWasShipped {orderId, customerName, lineItems}

公共流明确为适合客户而设计:OrderWasPlaced是一个概要事件,其他是胖事件,并且没有完整性保证,因为stockId并且transportId不在该流中。

公共流是一个不同的有界上下文:公共流中的一些语言不存在于上述私有流中,如OrderWasConfirmed这个事件; 并且OrderWasPlaced与OrderWasShipped等事件与私有流中同名事件也略有不同。

我们可以通过为每个消费者(例如客户通知系统,销售部门,运输公司等)制作单独的适配器,流和语言来进一步采用此示例。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

奔跑吧,程序员

奔跑吧,程序员

[美]叶夫根尼·布里克曼(Yevgeniy Brikman) / 吴晓嘉 / 人民邮电出版社 / 2018-7 / 99.00元

本书以软件工程师出身的创业者的角度,全面介绍了创业公司该如何打造产品、实现技术和建立团队,既是为创业者打造的一份实用入门指南,又适合所有程序员系统认识IT行业。书中内容分为三部分——技术、产品和团队,详细描绘创业的原始景象,具体内容包括:创业点子、产品设计、数据与营销、技术栈的选择、整洁的代码、软件交付、创业文化、招兵买马,等等。一起来看看 《奔跑吧,程序员》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具