zoukankan      html  css  js  c++  java
  • KINGSO介绍

    kingso_intro - Taocode

    KINGSO介绍

    KINGSO是一种高效的垂直化的搜索引擎,其包含query解析、检索、过滤、统计、排序功能,不包含抓取部分。它对商品搜索做了针对性的优化,目前在淘宝的多个应用中使用。

    系统架构

    如下是KINGSO的整体架构图:





    *蓝色的部分负责查询功能

    *黄色的部分负责建库功能

    *绿色的部分负责更新功能

    *红色的部分负责集群管理、负载均衡、容错

    查询流程

    1、前端将查询请求以URL的形式发送给Merger Server

    2、Merger Server对查询请求进行一定的转换改写之后(例如分词等),发送给多个Searcher

    3、收到请求的Searcher进行检索、过滤、统计、排序后,将结果返回给merger

    4、merger汇总各个Searcher返回的结果,进行一系列处理后(归并排序),生成获取展示信息的请求

    5、将请求发送给给Detail集群

    6、Detail经过一定的处理(主要是取字段和高亮显示),把显示所需信息返回给Merger

    7、Merger合并最终的展示信息返回给前端

    全量建库

    全量建库是指在离线状态下,解析原始数据(xml格式),生成在线查询中所需要的索引文件及信息文件

    全量建库流程如下:

    1、读取并解析原始数据文件(xml格式)

    2、根据配置文件,分别处理不同字段,生成倒排、正排、信息数据中间文件

    3、根据各种中间文件,建立最终的倒排索引、正排索引、信息

    增量更新

    增量更新是指在线状态下,接收并解析更新数据(xml格式),根据更新数据修改索引文件及信息文件

    增量更新流程如下:

    1、将增量消息通过网络传送给dispatcher

    2、dispatcher根据NID(文档的唯一标识)的hash值转交给某一个builder处理

    3、builder主线程解析这条消息,做归一化,编码,分词等操作。然后将消息push到文件队列

    4、builder发送线程读取文件队列内容,发起对某列所有detail进程的更新。一个线程对应一个detail

    5、builder发送线程读取文件队列内容,发起对某列所有searcher进程的更新。一个线程对应一个Searcher

    集群管理

    KINGSO的集群管理模块是使用clustermap,它的主要功能是:管理merger集群、search集群和detail集群,能够检测到集群节点的上下线,负载情况,使整个集群能够高容错、高效率的提供查询服务

    clustermap与各个服务(merger、searcher、detail)是通过四种报文进行交互的:

    *注册报文:

    每个服务节点都需要先发送注册报文给clustermap,告知自身的存在

    *心跳报文

    每个服务节点通过发送心跳报文给clustermap,报告健康状态

    *订阅报文

    只有merger等上游节点,才需要使用订阅报文,来向clustermap订阅其下游节点的状态信息

    *通知报文

    由clustermap发送给订阅的服务节点,通知其下游节点的状态变更

    服务框架

    KINGSO的各种服务角色(merger、searcher、detail)都是使用同一种服务框架framework

    该框架使用了异步通信模式,并通过剥离业务逻辑,使之具有良好的通用性

    framework架构图如下:





    服务流程:

    1、用户发出查询请求

    2、Service(anet回调类)处理查询请求,并根据请求内容生成session对象,放入任务队列taskQueue中

    3、Dispatcher从任务队列中获取session,生成相应的Worker对象,调度给线程池中的线程去执行Worker

    4、Worker进行应用逻辑相关的处理,返回应答信息给anet

    5、Anet负责把应答信息返回给用户

    单机模式

    有些应用场景,索引数据量不大,负载压力较低,一台服务器即可支持

    KINGSO针对这种情况,提供了单机模式,即一个searcher服务即可完成整个查询流程

    单机模式:





    查询流程:

    用户发出查询请求

    1、Service(anet回调类)处理查询请求,并根据请求内容生成session对象,放入任务队列taskQueue中

    2、Dispatcher从任务队列中获取session,生成相应的Worker对象,调度给线程池中的线程去执行Worker

    3、Worker调用QueryParser模块,解析查询请求

    4、Worker调用Search/Filter模块,对索引数据进行检索、过滤

    5、Worker调用Statistic模块,对检索后的结果进行统计

    6、Worker调用Sort模块,对检索后的结果进行算分、排序

    7、Worker调用detail模块,获取目标文档信息

    8、Worker对待展示信息进行格式化(目前支持xml及protobuf格式)

    9、Anet负责把最终展示信息返回给用户

    附件


    taiyi

    |
    2013-07-04 15:14:12
    |

    framework.jpg

    |

    35.5 KB

    taiyi

    |
    2013-07-04 15:13:58
    |

    single.jpg

    |

    37.8 KB

    taiyi

    |
    2013-07-04 15:12:45
    |

    architecture.jpg

    |

    32.5 KB

    taiyi

    |
    2012-08-23 11:20:05
    |

    架构图.jpg

    |

    32.5 KB

    taiyi

    |
    2012-08-23 11:20:05
    |

    服务框架.jpg

    |

    35.5 KB

    taiyi

    |
    2012-08-23 11:20:05
    |

    单机模式.jpg

    |

    37.8 KB
  • 相关阅读:
    css3圆角细节
    css3伪元素
    使用vscode在谷歌上运行代码
    SpringCloud-技术专区-Gateway优雅的处理Filter抛出的异常
    SpringCloud-技术专区-Gateway全局通用异常处理
    Mybatis-技术专区-插件开发指南
    消息中间件-技术专区-RabbitMQ基本介绍
    SpringBoot-技术专区-自定义TaskExecutor线程池
    MySQL-技术专区-Binlog和Redolog的介绍
    SpringBoot-技术专区-Redis同数据源动态切换db
  • 原文地址:https://www.cnblogs.com/lexus/p/3542910.html
Copyright © 2011-2022 走看看