基于微服务的架构中的关键字搜索

问题描述:

我需要一些建议,以了解如何执行搜索以在微服务拥有的关系数据库中搜索关键字。 我有一些微服务与他们自己的关系数据库。这些微服务可能会部署在码头集装箱中。 什么是使用像Apache Solr实现一个搜索引擎,使每个微服务数据库可以被索引的最佳方法,我们可以实现关键字搜索提前基于微服务的架构中的关键字搜索

感谢

这似乎是一个建筑问题虽然这很有意义,但问题也是一个开放的结局,取决于你的系统需要什么。有几件事情是从我的头顶开始的:

  1. 使用Apache SOLR的DataImportHandler
  2. 使用像Kafka或Kinesis这样的消息队列,并让独立的服务从它消耗来传播到它们的数据存储区,在这种情况下是由Apache SOLR支持的搜索服务和由MySQL支持的另一个服务。

就我个人而言,我从来没有使用过DataImportHandler,但我最初的想法是它将Apache SOLR连接到MySQL。设置DataImportHandler需要Apache SOLR知道MySQL模式,访问凭证等。因此,我建议第二个选项朝向无共享架构。

我打算将MySQL支持的服务称为“实体”服务,因为它听起来像是要保存某些特定类型对象的规范服务。实体服务和搜索服务将拥有自己的特定消费者,将Kinesis或Kafka的事件吸收到他们的数据存储中,将搜索服务提供给Apache SOLR,并将实体服务提供给MySQL。

这有助于将服务从知道彼此存在的地方分离出来,并且还可以让每个服务彼此独立扩展。这将成为数据冗余,但它应该没问题,因为数据访问模式不同。

我想提及的另一个警告是,它假定您保存的实体允许异步。请注意,此系统中的消息并不要求它在本例中为实体服务的时刻保存在MySQL中。但是,您可以根据自己的喜好将其更改为使消息在实体服务中保留,然后通过队列传播给搜索服务以进行索引。索引后,您可以添加额外的端点来搜索Apache SOLR。希望这可以让你对其他架构如何发挥作用有所了解。如果您对系统和涉及的实体有更多的了解,您可能会得到更好的答案。

+0

谢谢你@Will 大多数情况下会做SOLR + DataImportHandler。另外,因为我的数据库模式是高度关系的,所以将整个事物非规范化并不合理。我宁愿让它在数据库层仍然是关系型的,并且仍然在应用程序层中解耦它。我知道这会花费我更多的远程电话,但我似乎没有找到任何其他解决方案。 在这种情况下,数据库将成为单个大型数据库,因此DataImportHandler应该执行索引编制。 – sinjar

+1

没问题!很高兴我能帮助!只要它符合业务领域和前面的投资,这绝对是一个很好的解决方案。尽管听起来您可能会共享一个数据库,您可能会从中读取不同的服务。这实际上可能会导致您的服务通过模式紧密耦合。如果你想扩展,它可能不是最好的解决方案。 –