微服务中rest api调用过多

微服务中rest api调用过多,rest,web-services,microservices,loose-coupling,Rest,Web Services,Microservices,Loose Coupling,假设有两种服务, 服务A和服务B 服务A需要来自服务B的数据来处理请求。为了避免紧密耦合,我们对服务B进行RESTAPI调用,而不是直接查询服务B的数据库。 对每个请求进行HTTP调用服务B是否会缩短响应时间? 我看到了另一种在服务A中缓存数据的解决方案。我有以下问题 如果数据正在快速变化怎么办 如果数据非常重要,例如用户帐户余额详细信息,并且必须具有很强的一致性,该怎么办 数据重复和数据一致性如何 通过引入rest调用,我们不是在引入故障点吗?如果服务B停机怎么办 同样,通过增加对该特定API

假设有两种服务, 服务A和服务B

服务A需要来自服务B的数据来处理请求。为了避免紧密耦合,我们对服务B进行RESTAPI调用,而不是直接查询服务B的数据库。 对每个请求进行HTTP调用服务B是否会缩短响应时间? 我看到了另一种在服务A中缓存数据的解决方案。我有以下问题

  • 如果数据正在快速变化怎么办
  • 如果数据非常重要,例如用户帐户余额详细信息,并且必须具有很强的一致性,该怎么办
  • 数据重复和数据一致性如何
  • 通过引入rest调用,我们不是在引入故障点吗?如果服务B停机怎么办
  • 同样,通过增加对该特定API的服务A的请求,服务B的负载也在增加
    请帮我做这个

    这些问题有很多,让我试着以随机顺序给出一些评论:

    • 如果服务A需要来自服务B的数据,那么B已经是单点故障,因此可靠性问题只是从B的数据库转移到B的API端点。这不太可能,这会造成很大的不同
    • 对于延迟也有类似的说法:一个好的API层(包括缓存)甚至可以减少平均延迟
    • load也是一样:A对B的数据依赖关系已经包括了B数据库上的负载。同样,一个好的带缓存的API层甚至可以帮助加载
    因此,虽然解耦(从紧到松)带来了许多优点,但负载和可靠性不一定在缺点列表中

    关于缓存的几句话:

    读缓存对负载有很大的帮助:通常,从a到B的请求应该指示请求实体的版本,该版本在缓存中可用(当然可能没有),端点B可以验证实体是否已更改,如果没有,则停止所有处理,并返回“未更改”消息。B可以将信息保存在一个比实体本身小得多的数据存储中,这些实体在不久的过去已经改变了,最有可能将它们保存在RAM中,甚至保存在过程中,从而显著加快了速度


    在B的API端点中引入这种机制比在数据库本身中容易得多,因此查询API的可扩展性比查询DB要好得多。

    我想你应该问自己的第一个问题是a和B真的是两个不同的服务吗?首先划分它们的原因是什么?毕竟,它们似乎在时间上和数据上都是耦合的

    <> P>将一个服务分成两个可执行文件的原因之一可能是可以独立地更改或服务不同的访问路径,在这种情况下,您可能想考虑它们不同,现在这看起来像是没有区别的区别,但重要的是,从整体上看,系统的哪些部分可以了解其他部分的内部结构,并防止系统恶化为一个大泥球,每个“服务”都可以访问任何其他“服务”数据,它们都相互依赖


    如果这两个组件确实是不同的服务,您也可以考虑移动到服务B发布的数据主动更改的模型。这样,服务A可以缓存B数据的相关部分。B仍然是真相的来源,A与B的可用性是分离的(取决于数据的过期)

    嗨,Eugen Rieck,谢谢你的回答。不过我有一个问题,您提到的方法对于少量数据来说是不错的。如果数据很大,我们需要一些操作,比如排序,该怎么办。e、 g.如果我需要客户数据以及他下的订单,该怎么办。所以有两种服务,客户服务和订单服务。所以有一个数据连接。如果订单必须根据某些字段进行排序,该怎么办?此列表中没有什么是困难的:B需要一个方法来提供客户实体,一个方法来提供未排序的订单id/版本元组列表,另一个方法根据其id提供订单实体。您现在请求客户、id列表和订单,缓存所有内容。现在,您可以对端点内的列表进行排序并返回结果。在接下来的调用中,您只需要更新列表,然后进行筛选和排序,这可以在B中完成。这有助于大大减少A的负载。嗨,Eugen Rieck,我没有得到这个。请您详细说明一下。您对哪一部分有问题?此列表中的任何内容都不难:B需要一种方法来提供客户实体,一种方法提供未排序的订单id/版本元组列表,另一种方法根据订单实体的id提供订单实体。您现在请求客户、id列表和订单,缓存所有内容。现在,您可以对端点内的列表进行排序并返回结果。在接下来的通话中,你只需要更新列表,然后过滤和排序,这可以在B中完成。这有助于大大减少A-这一个的负载。嗨,Arnon,谢谢你的回答。假设有两个服务,客户服务和订单服务。我需要客户数据以及他下的订单。所以有一个数据连接。如果必须根据某些字段对顺序进行排序怎么办?在客户服务处缓存订单数据有意义吗?此外,如果数据的所有者服务正在发出事件。如果更新过于频繁,并且有太多其他服务需要处理的事件来保持数据的一致性,该怎么办。另一种情况是,如果数据是关键的,例如用户bannk帐户交易详细信息,该怎么办?围绕业务实体划分服务很少是一个好主意-这就像OOP的示例是animal和cat等。这些都是简单的示例,但由于它们没有围绕流和数据进行划分,因此它们往往是健谈和过度依赖的