【发布时间】:2017-04-15 12:16:20
【问题描述】:
我们的商店最近开始采用 SOA 方法进行应用程序开发。我们看到了关注点分离、可重用性和 SOA/微服务的其他好处的一些巨大好处。
但是,我们遇到的一个大项是跨服务聚合、过滤和分页结果。让我用一个场景来描述这个问题。
假设我们有 3 个服务:
- PersonService - 存储人员信息(姓名、地址等)
- ItemService - 存储有关可购买物品的信息。
- PaymentService - 存储有关人们为不同项目进行的付款的信息。
现在,假设我们要构建一个报告/管理工具,可以汇总显示/报告多个服务。例如,我们想要显示一个分页的付款列表,以及每次付款所针对的人员和项目。这非常简单:获取付款列表,然后查询 PersonService 和 ItemService 以获取相应的 Person 和 Item 记录。
但是,当我们想要过滤该数据时,问题就出现了:例如,显示购买了“汽车”项目的名字为“鲍勃”的人支付的分页列表。这使事情变得更加复杂,因为我们需要过滤来自 3 个不同服务的结果,而不知道每个服务将返回多少结果。
从性能的角度来看,一遍又一遍地查询所有服务以缩小结果范围会很昂贵,因此我一直在研究更好的解决方案。但是,我找不到这个问题的具体解决方案(或者至少是“最佳实践”)。在单体应用程序中,我们只需在不同的表中使用 SQL 连接。我在弄清楚如何/是否在服务中可能出现类似的事情时遇到了很多麻烦。
我向社区提出的问题是:您的方法是什么?我考虑过的事情:
- 使用某种搜索索引(Elasticsearch、Solr)包含所有服务的所有数据(通过服务推出的事件更新),然后查询搜索结果索引。
- 尝试了解 GraphQL 和 Neo4j 等项目如何帮助我们解决这些问题。
【问题讨论】:
-
Chris Richardson 对每个服务的数据库和服务之间的共享数据库有一些见解:microservices.io/patterns/data/database-per-service.html
-
嗨,迈克。你是如何解决这个问题的?我也遇到了类似的情况。我有 ES 作为数据存储。
-
@Richa 我们真的没有。我们仍然对不同的服务进行 REST 调用来检索我们想要的数据。然而,我们正在朝着事件溯源模式发展,在这种模式下,任意数量的服务都可以侦听数据并存储它们需要的数据。因此,所有更新都通过事件总线,服务复制其业务流程所需的数据。您可以将其视为类似于 NoSQL 方法(查看 Firebase 建议如何存储可在多个领域重复使用的对象)。
-
@Richa:你现在有机会解决这个问题吗?我也遇到了您描述的相同情况,但找不到具体的解决方案。我很早就在 SOF 上发布了我的问题,但还没有得到任何回应。
-
@Mike:你能详细说明一下事件溯源模式吗?谢谢
标签: web-services rest integration soa microservices