跨多个微服务跨数据搜索


13

我在微服务和旧数据库之间分配了某个域的数据。我的搜索跨越了旧版和微服务数据库上的字段。以前(在拆分微服务之前),它是通过1个sql查询完成的。现在,我需要一个REST调用和一个对旧数据库的查询来提供此搜索功能。我们在这里谈论的是几百万行。我怎样才能做到最好?由于数据量大,REST调用通常也会返回分页结果。激发SQL调用并将结果与​​REST响应合并和合并的幼稚方法太慢且不切实际。

Answers:


21

可以将搜索功能建模为单独的服务,并与您提到的两个服务负有单独的责任。因此,这里的方法可能是创建一个新服务(“搜索”),并以易于索引和搜索的形式存储来自两个服务的数据副本,还可能进行非规范化以便快速给出结果。所需的格式。

因此,例如,您可以使用例如mySql的遗留SQL数据库,使用例如MongoDB的另一个微服务,以及使用elasticsearch的新搜索服务,并将两者中的数据粘贴在一起(去规范化),以实现更方便的访问。当然,详细信息将取决于您需要执行的搜索类型。

最好通过事件总线(例如Kafka或Hermes)将来自这两个服务的数据异步传输到搜索索引,以提高吞吐量并减少服务之间的耦合。两项服务中的任何一项更改都会发送一个事件,通知搜索服务也要更新其数据。

当然,在服务和搜索服务的更改之间会存在额外的延迟,但是由于微服务通常用于分布式系统中,因此无论如何都不可避免地会出现一些延迟和暂时的不一致。拥有额外的服务并使用额外的存储空间来存储其他两个服务中已经存在的数据副本,这也是使用微服务构建高度分布式且可伸缩的系统的典型成本。


我已经开始创建单独的服务了。唯一让我感到不舒服的事情是-创建另一个仅用于搜索的数据库(将数据库馈
送给Elastic

7
@zencv不幸的是,微服务带有这样的成本。能够水平缩放意味着耦合很弱,这意味着经常会有数据重复。您还将获得更多的网络流量。可伸缩性通常意味着每个硬件的性能下降,并且选择一种架构而不是另一种架构(例如,微服务与整体式架构)必须考虑这一折衷。
米哈尔Kosmulski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.