node.js - 从不同的微服务收集数据的正确方法是什么?

标签 node.js architecture microservices

我在理解微服务之间应该如何进行基本通信时遇到问题,并且在其他问题中我无法找到一个好的解决方案或标准方法来做到这一点。让我们使用这个基本示例。

enter image description here

我有一个发票服务,可以返回发票,每张发票都将包含有关用户和产品的信息(id)。如果我有一个需要为特定用户呈现发票的 View ,我只需提出一个简单的请求。

let url = "http://my-domain.com/api/v2/invoices"
let params = {userId:1}
request(url,params,(e,r)=>{
  const results = r // An array of 1000 invoices for the user 1
});

现在,对于这个特定的 View ,我需要发出另一个请求来获取每张发票上每个产品的所有详细信息。

results.map((invoice)=>{
   invoice.items.map((itemId)=>{
      const url=`http://my-domain.com/api/v2/products/${itemId}`
      request(url,(e,r)=>{
       const product = r
       //Do something else.....
      });
   });
});

我知道代码示例并不完美,但您可以看到,这将生成大量对产品服务的请求(至少 1000 个),并且仅针对 1 个用户,现在想象一下,如果我有 1000 个用户进行此类操作请求。

在不必发出如此数量的请求以避免性能问题的情况下从所有产品获取信息的正确方法是什么?。

我找到了针对此类场景的一些解决方法,例如:

  1. 创建一个接受 ID 列表的 API 端点,以便发出单个请求。
  2. 在发票服务中复制产品服务中的信息,并找到使它们保持同步的方法。

在微服务架构中,这些是处理此类问题的正确方法吗?对我来说,它们看起来像是简单的解决方法。

编辑 #1:基于 Remus Rusanu 的回复。

根据 Remus 的建议,我决定隔离我的服务并更好地描述它们。

enter image description here

如上图所示,微服务现在是隔离的(特别是计费服务),它们现在是数据的所有者。通过使用这种结构,我确保即使存在异步作业或其他两个服务关闭,计费服务也能够工作。

如果我需要创建新发票,我可以同步调用其他两个微服务(用户、库存),然后更新计费服务中“缓存”表(用户、库存)上的数据。

假设这些“缓存”表是只读的也很好吗?我认为它们是因为只有用户/库存服务应该能够修改此信息以保持信息的隔离和权限。

最佳答案

您需要隔离服务,以便它们不共享状态/数据。您问题中的设计是将单个宏服务分为 3 个相关的存储孤岛。举个例子,如果不将数据与“产品”响应关联起来,您就无法解释“发票”服务的结果。

隔离的微服务意味着它们拥有自己的数据并且可以独立运行。从“发票”服务返回的发票是完整的。它包含产品名称、客户名称、发票上的所有信息。所有数据都来自其自己的存储。一个单独的微服务可以是“库存”,它运行所有产品库存、当前库存等。它还将在自己的存储中拥有自己的数据。一个“产品”可以同时存在于两种存储介质中,并且它们之间曾经存在逻辑链接(在创建发票时),但现在该链接已被切断。 “库存”微服务可以更改其产品(例如删除一个、添加新的 SKU 等),而不会影响现有发票(这不仅是微服务隔离要求,也是基本会计要求)。我不打算在这里详细介绍现实生活中的产品“身份”。

如果您发现自己问这样的问题,则可能意味着您没有微服务。您应该考虑微服务边界,同时考虑如果将所有通信替换为基于异步队列的请求(响应可能会在 6 天后出现)会发生什么:如果语义中断,则边界可能是错误的。如果语义成立,那就是正确的道路。

关于node.js - 从不同的微服务收集数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50672490/

相关文章:

architecture - 您使用什么进行 Web 开发以及为什么您认为它很摇滚?

java - 优点和缺点 : having Enum or Class for Message Notification types

database - 结合使用关系数据库和键值存储

api - API 是否应该将所有工作委托(delegate)给其他服务?

javascript - 语法错误: Unexpected token o in JSON at position 1 EXPRESS

node.js - Sequelize 已弃用的错误消息

java - 微服务通信

spring-boot - 在Spring中保存以前的身份验证

node.js - 使用 Node.js 将流分块为数据 block

node.js - createreadstream 是异步的吗?