gpt4 book ai didi

web-services - 跨微服务查询/分页

转载 作者:行者123 更新时间:2023-12-03 15:02:46 25 4
gpt4 key购买 nike

我们的商店最近开始采用 SOA 方法进行应用程序开发。我们看到了关注点分离、可重用性和 SOA/微服务的其他好处的一些巨大好处。

但是,一个 我们坚持的项目是跨服务聚合、过滤和分页结果。让我用一个场景来描述这个问题。

假设我们有 3 个服务:

  • 人员服务 - 存储有关人员的信息(姓名、地址等)
  • 项目服务 - 存储有关可购买元素的信息。
  • 支付服务 - 存储有关人们为不同项目进行的付款的信息。

  • 现在,假设我们要构建一个报告/管理工具,可以汇总显示/报告多个服务。例如,我们想要显示一个分页的付款列表,以及每次付款所针对的人员和项目。这非常简单:获取付款列表,然后查询 PersonService 和 ItemService 以获取相应的 Person 和 Item 记录。

    但是,当我们想要过滤掉这些数据时,问题就出现了:例如,显示一个分页的付款列表,该列表是由购买了“汽车”项目的名字为“鲍勃”的人支付的。这使事情变得更加复杂,因为我们需要过滤来自 3 个不同服务的结果,而不知道每个服务将返回多少结果。

    从性能的角度来看,一遍又一遍地查询所有服务以缩小结果范围会很昂贵,所以我一直在研究更好的解决方案。但是,我找不到这个问题的具体解决方案(或者至少是“最佳实践”)。在单体应用程序中,我们只需在不同的表中使用 SQL 连接。我在弄清楚如何/是否在服务中可能出现类似的事情时遇到了很多麻烦。

    我向社区提出的问题是:您的方法是什么?我考虑过的事情:
  • 使用某种搜索索引( Elasticsearch Solr ),其中包含所有服务的所有数据(通过服务推出的事件更新),然后查询搜索索引以获取结果。
  • 试图了解 这样的项目GraphQL Neo4j 可以帮助我们解决这些问题。
  • 最佳答案

    我坚持 Sam Newman谁在他的书的第 4 章“共享数据库”中说:

    Remember when we talked about the core principles behind good microservices? Strong cohesion and loose coupling --with database integration, we lose both things. Database integration makes it very easy for services to share data, but does nothing about sharing behaviour. Our internal representation is exposed over the wire to our consumers, and it can be very difficult to avoid making breaking changes, wich inevitably leads to fear of any changes at all. Avoid at (nearly) all costs.



    这就是我诅咒内容管理系统时要表达的观点。

    在我看来,微服务是自治的,如果它共享或消费共享的东西,它就不可能是自治的。我在这里提出的唯一异常(exception)是域对象,它们代表了对业务模型的共同理解,并且必须仅用于微服务之间的通信。

    ER 或面向聚合的数据库(分为基于文档或基于图形)是否更适合需求取决于微服务本身。
    有趣的是,通过松散耦合和自治,您可以做到这一点!

    如果一个 PaymentService 共享“为 A 支付多少”的行为
    他需要了解人 A 才能完成这一点。但是他所知道的关于人 A 的一切都必须来自 PersonService,可能在运行时(PaymentService 可能只存储一个 id)或基于事件(PaymentService 将它需要的数据存储给域对象用户,触发并提供更新的内容由 PersonService)。 PaymentService 本身不共享用户本身。

    关于web-services - 跨微服务查询/分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900818/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com