elasticsearch 微服务体系结构的文本搜索,elasticsearch,architecture,microservices,elasticsearch,Architecture,Microservices" /> elasticsearch 微服务体系结构的文本搜索,elasticsearch,architecture,microservices,elasticsearch,Architecture,Microservices" />

elasticsearch 微服务体系结构的文本搜索

elasticsearch 微服务体系结构的文本搜索,elasticsearch,architecture,microservices,elasticsearch,Architecture,Microservices,我正在研究在基于微服务的系统上实现文本搜索。我们必须搜索跨越多个微服务的数据 例如,假设我们有两项服务用于管理组织和管理联系人。我们应该能够在一次搜索操作中通过联系方式搜索组织 我们首选的搜索解决方案是Elasticsearch。我们已经有了一个基于嵌入式对象(和/或父子对象)的工作解决方案,其中当更新父域时,索引有效负载将被包含在缓存中的依赖对象数据丰富(我们避免为此直接调用管理子对象的服务) 我想知道是否有更好的解决办法。是否有适用于此类场景的微服务模式?我建议您,这不是一种特别的微服务模式

我正在研究在基于微服务的系统上实现文本搜索。我们必须搜索跨越多个微服务的数据

例如,假设我们有两项服务用于管理组织和管理联系人。我们应该能够在一次搜索操作中通过联系方式搜索组织

我们首选的搜索解决方案是Elasticsearch。我们已经有了一个基于嵌入式对象(和/或父子对象)的工作解决方案,其中当更新父域时,索引有效负载将被包含在缓存中的依赖对象数据丰富(我们避免为此直接调用管理子对象的服务)


我想知道是否有更好的解决办法。是否有适用于此类场景的微服务模式?

我建议您,这不是一种特别的微服务模式,但它非常适合微服务,它被称为事件来源

事件源描述了一种体系结构模式,其中事件由不同的源生成。事件现在将触发0个或多个所谓的投影,然后使用事件中包含的数据以所需的形式聚合信息

这直接适用于您的问题:只要组织服务更改其内部状态(添加/删除/更新组织),它就可以触发事件。如果添加了一个组织,它将例如将联系人聚合到此组织并存储此聚合。现在对它的搜索很简单:在聚合信息中查找组织id(可以编制索引),然后返回与此组织关联的联系人。当然,如果合同被添加到合同服务中,同样的方法也会起作用:它只是触发一条包含合同创建信息的消息,而相应的投影现在改变了不同的聚合,这些聚合可以再次被索引和快速搜索

您可以让多个投影对单个事件做出响应—这使您能够以多种不同的形式聚合信息—这正是您稍后查询信息的方式。不要害怕重复的数据:事件源有意地进行这种权衡,因为这不是您的业务服务所依赖的数据,您不需要手动更改它—这种重复不会伤害您

如果你按照事件发生的时间顺序存储事件(我郑重建议你这么做!),你可以一遍又一遍地“重播”这些事件。这有助于例如,如果投影有问题,必须进行修复

如果您感兴趣,我建议您阅读活动采购,并寻找某种类型的活动商店:

我们使用事件源在我们的系统中聚合一系列不同的搜索,并每天将数以百万计的记录聚合到mongodb中。所有的投影都有自己的集合,创建自己的索引,直到现在,我们还不必求助于不同的系统/模式,比如弹性搜索等等

让我知道这是否有用

修正案

使用事件中包含的数据以所需的形式聚合信息

事件应包含聚合更多信息所需的所有信息。例如,如果您有一个组织创建事件,您需要至少提供一些关于组织名称、某种ID、创建日期、父组织ID等的信息。根据经验,我们会发送在获取请求的服务中收集的所有信息(不要直接从请求中获取;-)首先检查它,然后把它写在活动上并发送出去),因为我们不知道将来需要什么。请保持谨慎-有效负载不应太大

我们现在可以有多个投影来响应此事件:一个将组织添加到其父集合中的投影(以便轻松查找给定组织的所有子级),一个是将其添加到所有组织的搜索集中,第三个可能是聚合给定子组织的所有父组织,以便轻松快速地查找父组织

我们有相同的服务处理这些事件,它们也处理客户端请求。其背后的动机是,您的投影创建的数据模式与客户端与之交互的服务读取数据的方式紧密耦合。这不一定是这样的,它可以分为两个服务——但是您在那里创建了一个几乎看不见的依赖关系,并且独立地发布这两个服务变得更具挑战性。但是,如果你不介意这种额外的复杂性,你可以将两者分开


我们目前也在考虑编写一个通用服务来聚合事件中的信息,比如搜索,在搜索中可以编写预测脚本。这只会使不可见依赖项问题变得不那么突出,但并不能解决它。

谢谢您的回复。请您详细说明“使用事件中包含的数据以所需的形式汇总信息”部分。您是否使用与此聚合的客户端请求服务相同的服务?