微服务与服务协作

Microservice and service collaboration

在微服务架构的上下文中,单个业务操作可能需要两个或多个服务之间的协作。

假设我们有一个订单管理服务和一个产品目录服务。 当用户向订单添加订单项时,订单管理服务将保留一个 OrderItem 对象,该对象具有以下属性:

OrderItem 
+ Id
+ ProductId
+ ProductName 

为了让订单管理服务填写 ProductName 属性,我认为我们有 4 个选择:

选择 1:ProductName 由客户端应用程序提供,因为它可能已经从之前的请求中获得了此数据

选择 2 :如果架构使用 Api 网关,网关将负责从产品目录服务中检索 ProductName,然后将其提供给订单管理服务。

选择 3:订单管理服务将直接调用产品目录服务并询问他给定产品 ID 的产品名称。

选择 4:订单管理服务在其自己的数据库中有重复的(但不是详尽无遗的)产品信息,每次从产品目录服务。

在这 4 个选择中,n°1 对我来说似乎不太合适,因为我们不能相信客户会为我们提供正确且更新的 ProductName 值。

我想听听您对最佳选择的看法以及原因!

谢谢!

莉安娜

Choice 1 : ProductName is given by the client app as it probably already has this data from previous requests

就像你说的,这不是最好的主意,因为客户端可能有过时的信息。如果产品信息不经常更改,也许可以接受 and/or 您在订单处理时进行了二次验证。

Choice 2 : If the architecture uses an Api Gateway, the gateway will be responsible for retrieving the ProductName from the Product Catalog Service then provide it to the Order Management Service.

恕我直言,这不是个好主意。通过这样做,您的 domain/business 逻辑将泄漏到 API 网关。网关现在知道订单和产品之间的关系。此 API 网关 configuration/scripting 将需要维护并引入额外的耦合。

Choice 3 : The Order Management Service will call directly the Product Catalog Service and asks him for the ProductName givent a product id.

这是我的首选。虽然我不推荐 "direct" 同步调用。可能是通过消息传递机制(消息队列、事件总线)检索 ProductName。链式同步调用会降低服务的可用性。您可以在 Microservice Messaging Pattern.

找到更多信息

Choice 4 : The Order Management Service has a duplicate (but not exhaustive) product informations in its own database and these datas will be updated each time an update event is received from the Product Catalog Service.

除非有充分的理由,否则数据重复通常是不受欢迎的。在这种情况下,我没有看到任何。为什么要为每个服务将数据库分成两个,但又要在它们之间复制数据呢?此外,每次收到更新事件时更新数据表明某种 event/messaging 基础设施可用,在这种情况下,为什么不直接使用消息传递?

对于高容量、低延迟的查找,这种重复可能是合理的,但这是一个滑坡,最终可能会在您的服务中出现重复数据。想象一下 ProductName 字符串的长度或 type/format 变化的影响...