京东亿级商品搜索核心技术解密(2)
搜索请求流程如下:
Blender、Merger、Searcher和Detail是整个系统的核心组件,它们之间的调用关系由Clustermap管理.各个模块将自己的服务注册到ClusterMap,同时从ClusterMap订阅其调用模块的信息来确定实际调用关系. 简要搜索服务流程,如下图所示(搜索服务系统内部处理流程): 图中名词解释如下:
用户请求发送到blender,首先解析参数.如果命中blender page cache直接返回给用户.如果没有命中,则调用运营平台服务(OP)和QP,并将其传给Merger,Merge会检查是否命中Attr cache,如果命中并且恰好仅请求属性汇总结果,直接返回给blender.否则进一步查看是否命中merger page cahce,如果命中直接调用detail包装,返给blender.如果没有命中,则调用User Profile获取用户标签,将其传给searcher(篇幅所限,图中只列了一个searcher,实际是多个).Searcher接到请求,判断是否命中doc cache,如果命中doc cache,则拉取增量结果;如果没有命中doc cahe,则拉取全量和增量结果.然后依次进行排序、在线业务处理,把结果返给merger.Merger合并多个searcher结果,排序、在线业务处理,最后调用detail包装,最后将结果返给blender,blender合并多个搜索结果后返回给用户. 作为一个高并发系统,为了保证高召回率和低响应延时,我们把整个搜索服务流程的处理全部放在内存当中进行计算.多个searcher并发处理请求,同时单个searcher内部采用线程池技术,即所有线程之间共享倒排索引和商品属性信息,提高内存使用效率;每个查询使用一个独立线程串行执行,保证并发的多个查询线程之间互不影响.此外通过合理的设置线程池的大小,我们可以保证系统的CPU资源得到充分利用.在上述两个方面对系统进行优化之后,整个搜索服务系统的稳定性、召回率、内存使用率、计算速度等指标都有大幅度的提高.但是我们改进系统的步伐并没有停歇,因为通过实践发现基于内存和线程池的搜索服务仍然有几个瓶颈点亟需解决,主要包括:拉取倒排、排序和在线业务处理.针对这些问题,我们进行了二次优化,主要包括如下措施: 1. 多级缓存策略
虽然拉取倒排结果缓存的key很快就解决了,但是我们在解决Value的存储时遇到了两个问题:1)拉取倒排的结果非常之多,导致缓存过大;2)对此结果缓存,会降低实时索引的时效性. 对于问题1),在分析了业务之后,对需要缓存的信息进行了大量的精简并采用压缩存储,最终将一个查询的缓存控制在0.5M以下. (编辑:ASP站长网) |