【发布时间】:2020-03-27 00:15:52
【问题描述】:
现在我正在研究一个有趣的(至少从我的角度来看)商业案例,我必须在云环境中正确设计它。
假设我们有一个产品服务处理所有产品目录数据,例如产品层次结构、产品描述和产品关系。该服务有一个 REST API,并提供所有必要的 API 来处理产品,包括过滤、排序和搜索。
现在我们又增加了一项服务:产品价格服务。该服务处理所有与定价相关的逻辑和计算,包括折扣、客户特定价格。此服务还有一个 REST API,可为所请求的产品提供价格。
此时,画面似乎很简单:我们有 2 个职责明确的服务。从客户的角度来看,一切看起来都很简单:
- 请求产品
- 查询产品价格
现在我们有一个业务需求,要添加一个新的过滤器“低于 20 美元”。基本上,这意味着我们需要有一个完全相反的工作流程:我们需要先调用产品价格服务。此外,我们在产品服务中提供了一系列过滤器,可以轻松地与新的定价过滤器结合使用。
业务需求让我想到了这些服务的域边界,唯一的想法是边界是错误的(即使一开始没问题)。请分享您对如何在这种情况下正确定义服务架构的经验/意见。
最好的问候, 阿图尔。
【问题讨论】:
-
产品具有属性,如颜色、尺寸等。我假设第一个服务提供这些属性并允许通过这些属性进行搜索。问题是:价格和颜色有什么区别?它们都是产品的属性,对吧?
-
@MaximSagaydachny 我同意。但是,产品属性是静态的,不会随着时间而改变,例如塑料玩具总是由塑料制成。产品价格每天都在变化,具体取决于销售活动、客户产品等各种因素。此外,价格服务包含某些繁重的计算,如税收。基本上,这就是我们有 2 项服务的原因。
-
产品服务要价服务如何转换当前登录的客户申请什么转换?价格服务返回类似 "(current_price*0.95)" (与客户相关的产品折扣和当前全球折扣)。然后产品服务在不知道业务原因的情况下,在 SQL 中盲目使用这部分。因此,您可以显示价格并使用过滤器,而无需任何额外的服务内调用和丑陋的解决方案,即在产品从 DB 投入使用后将其从记录集中丢弃。这有点难看,但可以保持边界合乎逻辑。
-
很遗憾,我们没有针对客户的单一折扣率。作为客户,您可以享受 20% 的工具折扣和 10% 的这些工具配件折扣 - 每个价格都非常个性化。
-
这就是我的意思-价格服务和用户服务一起知道为某些特定类别和当前用户申请什么折扣。他们可以将折扣详细信息传递回产品服务。工作流程是:customer->query product service(filter:"price>234")->product-service-> priceSvc.getDiscount(user, productCategory); priceSvc 将折扣返回给产品 svc(这都是当前客户的上下文);产品 svc 使用折扣信息(特定于上下文)来查询数据库并向客户显示数据。产品服务不知道任何业务逻辑,但能够快速查询数据库。
标签: architecture cloud domain-driven-design microservices