Architecture 正确的微服务域边界

Architecture 正确的微服务域边界,architecture,cloud,domain-driven-design,microservices,Architecture,Cloud,Domain Driven Design,Microservices,现在我正在研究一个有趣的商业案例,至少从我的角度来看,我必须在云环境中正确地设计它 让我们设想一下,我们有一个处理所有产品目录数据的产品服务,例如产品层次结构、产品描述和产品关系。该服务有一个RESTAPI,并提供所有必要的API来处理产品,包括过滤、排序和搜索 现在我们又增加了一项服务:产品价格服务。此服务处理所有与定价相关的逻辑和计算,包括折扣、客户特定价格。此服务还有一个RESTAPI,它为请求的一个或多个产品提供价格 在这一点上,情况似乎很简单:我们有两个职责明确的服务。从客户的角度来看

现在我正在研究一个有趣的商业案例,至少从我的角度来看,我必须在云环境中正确地设计它

让我们设想一下,我们有一个处理所有产品目录数据的产品服务,例如产品层次结构、产品描述和产品关系。该服务有一个RESTAPI,并提供所有必要的API来处理产品,包括过滤、排序和搜索

现在我们又增加了一项服务:产品价格服务。此服务处理所有与定价相关的逻辑和计算,包括折扣、客户特定价格。此服务还有一个RESTAPI,它为请求的一个或多个产品提供价格

在这一点上,情况似乎很简单:我们有两个职责明确的服务。从客户的角度来看,一切看起来都很简单:

请求产品 索取产品价格 现在,我们有一个业务需求,需要在20美元以下添加一个新过滤器。基本上,这意味着我们需要一个完全相反的工作流程:我们需要首先调用产品价格服务。此外,我们在产品服务中提供了一系列过滤器,可以轻松地与新的定价过滤器组合

业务需求让我想到了这些服务的域边界,唯一的想法是这些边界是错误的,即使在开始时还可以。请分享您在这种情况下如何正确定义服务体系结构的经验/观点

致以最良好的祝愿,
Artur.

这是一个非常简单的权衡,要么你想让产品服务部门了解客户的价格,要么你让过滤器忽略折扣,只在标价上做。这是大多数商店的过滤方式,他们不考虑个性化定价

如果您必须使用个性化定价,那么您需要进行经典的时间/空间权衡。您可以将所有产品预先解析为价格,使用更多的空间,但时间要少得多,或者您可以根据折扣动态计算价格,并花费更多的时间


您可以将计算推到离数据存储更近的位置,以牺牲体系结构的纯度为代价,从而将时间最小化。为了实现性能目标,打破架构的纯洁性是很常见的,这只是一个需要明确做出的决定。

这是一个非常简单的权衡,要么你想让产品服务了解客户的价格,要么你让过滤器忽略折扣,只按标价来做。这是大多数商店的过滤方式,他们不考虑个性化定价

如果您必须使用个性化定价,那么您需要进行经典的时间/空间权衡。您可以将所有产品预先解析为价格,使用更多的空间,但时间要少得多,或者您可以根据折扣动态计算价格,并花费更多的时间

您可以将计算推到离数据存储更近的位置,以牺牲体系结构的纯度为代价,从而将时间最小化。打破体系结构的纯洁性以实现性能目标是很常见的,这只是您需要明确做出的决定。

我认为一种可能的主流方法:实现。在您的场景中,这意味着API网关将执行以下步骤:

询问过滤和分页的产品价格微服务,例如20美元以下的前20个产品列表。 请向Products micro service咨询这20种产品的详细信息。 将产品的详细列表返回给调用方Web前端。 这能解决您的问题吗?

我认为有一种可能的主流方法:实现。在您的场景中,这意味着API网关将执行以下步骤:

询问过滤和分页的产品价格微服务,例如20美元以下的前20个产品列表。 请向Products micro service咨询这20种产品的详细信息。 将产品的详细列表返回给调用方Web前端。
这能解决您的问题吗?

找到正确的域边界主要是找到设计聚合所需的最小事务边界。事务处理写端,比如CQR。对于阅读端,您可以以任何有用的方式进行混合和匹配。这可以作为一个单独的组件实现:产品搜索服务。例如,它可以使用ElasticSearch

如果你有在一个有许多部门和文档流的大型成熟组织中工作的背景,那么你可以将组织结构视为良好领域边界的一个例子,并从中获得灵感。如果一个外部实体从这样的组织获得任何输出,准备输出可能是某个专门部门的责任

具体谈到您的问题,似乎客户级别或个人条件应该由某个CRM管理。这与价格服务是分开的。而且,给定一个产品和一个基本价格,CRM应该决定折扣是多少
t或price列应用。

找到正确的域边界主要是找到设计聚合所需的最小事务边界。事务处理写端,比如CQR。对于阅读端,您可以以任何有用的方式进行混合和匹配。这可以作为一个单独的组件实现:产品搜索服务。例如,它可以使用ElasticSearch

如果你有在一个有许多部门和文档流的大型成熟组织中工作的背景,那么你可以将组织结构视为良好领域边界的一个例子,并从中获得灵感。如果一个外部实体从这样的组织获得任何输出,准备输出可能是某个专门部门的责任


具体谈到您的问题,似乎客户级别或个人条件应该由某个CRM管理。这与价格服务是分开的。而且,给定一种产品和一个基本价格,CRM应该决定采用什么样的折扣或价格栏。

我认为您在DDD方面遗漏了一个非常重要的要点。为了简化DDD定义,它描述了当用户发送命令时如何更改数据应用程序状态。当用户想问什么问题时,它没有给出任何指导方针。这当然是非常高层次的观点

为了回答用户提出的问题,您完全可以使用任何必要的手段在合理的时间内提供准确的答案

因此,只要不修改系统的状态,就可以违反任何边界、读取任何私有状态或直接访问数据库来计算答案

例如,一些架构模式(如CQR)完全基于此假设


从高层次的角度来看,DDD中的边界是关于如何设计软件的编写部分的指导原则。

我认为您遗漏了DDD中非常重要的一点。为了简化DDD定义,它描述了当用户发送命令时如何更改数据应用程序状态。当用户想问什么问题时,它没有给出任何指导方针。这当然是非常高层次的观点

为了回答用户提出的问题,您完全可以使用任何必要的手段在合理的时间内提供准确的答案

因此,只要不修改系统的状态,就可以违反任何边界、读取任何私有状态或直接访问数据库来计算答案

例如,一些架构模式(如CQR)完全基于此假设


从高层的角度来看,DDD中的边界同样是关于如何设计软件写入部分的指导原则。

产品具有颜色、大小等属性。我假设first service提供这些属性,并允许通过这些属性进行搜索。问题是:价格和颜色有什么区别?它们都是产品的属性,对吗?@MaximSagaydachny我同意。但是,产品属性是静态的,不会随时间而改变,例如,塑料玩具始终由塑料制成。产品价格每天都在变化,这取决于各种因素,如销售活动、客户服务等。此外,价格服务还包含某些繁重的计算,如税收。基本上,这就是为什么我们有2项服务的原因。产品服务如何询问价格服务对于当前登录的客户申请什么转换?价格服务返回与客户相关的产品的当前价格*0.95种最终折扣和当前全球折扣。然后产品服务在不知道业务原因的情况下盲目地在SQL中使用这一部分。因此,您可以显示价格并使用过滤器,而无需任何额外的服务内调用和丑陋的解决方案,即在产品从DB投入服务后将其从记录集中丢弃。这有点难看,但可以保持合理的界限。不幸的是,我们没有一个单一的折扣率为我们的客户。作为客户,您可以享受工具20%的折扣和这些工具配件10%的折扣-每个价格都是非常个性化的。这就是我的意思-价格服务和用户服务一起知道对某些特定类别和当前用户应用什么折扣。他们可以将折扣详细信息传回产品服务部门。工作流程为:客户->查询产品服务过滤器:价格>234->产品服务->价格svc.getDiscountuser,产品类别;priceSvc向产品svc返回折扣这是当前客户的全部内容;product svc使用折扣信息上下文特定于查询数据库并向客户显示数据。产品服务不知道任何业务逻辑,但能够快速查询数据库。产品具有属性,如颜色、大小等。我假设第一个服务提供这些属性,并允许通过这些属性进行搜索。问题是:价格和颜色有什么区别?它们都是产品的属性,对吗?@MaximSagaydachny I-wou
我同意。但是,产品属性是静态的,不会随时间而改变,例如,塑料玩具始终由塑料制成。产品价格每天都在变化,这取决于各种因素,如销售活动、客户服务等。此外,价格服务还包含某些繁重的计算,如税收。基本上,这就是为什么我们有2项服务的原因。产品服务如何询问价格服务对于当前登录的客户申请什么转换?价格服务返回与客户相关的产品的当前价格*0.95种最终折扣和当前全球折扣。然后产品服务在不知道业务原因的情况下盲目地在SQL中使用这一部分。因此,您可以显示价格并使用过滤器,而无需任何额外的服务内调用和丑陋的解决方案,即在产品从DB投入服务后将其从记录集中丢弃。这有点难看,但可以保持合理的界限。不幸的是,我们没有一个单一的折扣率为我们的客户。作为客户,您可以享受工具20%的折扣和这些工具配件10%的折扣-每个价格都是非常个性化的。这就是我的意思-价格服务和用户服务一起知道对某些特定类别和当前用户应用什么折扣。他们可以将折扣详细信息传回产品服务部门。工作流程为:客户->查询产品服务过滤器:价格>234->产品服务->价格svc.getDiscountuser,产品类别;priceSvc向产品svc返回折扣这是当前客户的全部内容;product svc使用折扣信息上下文特定于查询数据库并向客户显示数据。产品服务不知道任何业务逻辑,但能够快速查询数据库。还有一个挑战:如果我想按产品服务的评级订购这些产品,该怎么办?不错:例如,假设性能不会受到太多产品的影响:1向产品价格微服务咨询筛选出的20美元以下的产品列表。2向Products micro service咨询前20种产品的详细信息-按评级订购。3同上:我承认,这种方法可能需要性能优化。但是如果有数千种产品比20美元便宜呢?我必须从定价服务处获得大量ID,并将其传递给产品服务处进行排名。还有一个挑战:如果我想通过产品服务处的评级订购这些产品,该怎么办?不错:例如,假设性能不会因为太多产品而受到影响:1向产品价格微服务处询问过滤后的产品列表低于20美元的产品。2向Products micro service咨询前20种产品的详细信息-按评级订购。3同上:我承认,这种方法可能需要性能优化。但是如果有数千种产品比20美元便宜呢?我必须从定价服务处获得大量ID,并将其传递给产品服务处进行排名。