技术专栏(七):数据魔方「查询引擎」,百万请求秒级响应“解密”




本期技术分享家

AdMaster架构师 蒋善文



技术专栏的开篇,我曾详细介绍AdMaster的底层社交数据处理平台——SocialMaster数据魔方(点击查看往期文章),这个多阶数据魔方,承担着所有社交数据的清洗、计算、存储和分析工作,是AdMaster提供社交和洞察服务的稳健根基。数据魔方由多个服务和组件组成,其中,技术专栏第四期介绍的ES(Elasticsearch),主要负责数据存储和检索,今天分享的查询引擎,也是数据魔方的核心组成部分,它是AdMaster基于前端社交业务复杂的查询场景,特别开发的一套查询引擎,也是数据魔方核心分析功能的统一出口。



百万查询秒级响应,

数据魔方的试金石



数据魔方作为Paas平台,后端所有复杂的技术功能都需要集中在一个界面清晰显示,正所谓后端风起云涌,前端风平浪静,而查询,就是检验一个系统是否稳健的试金石。面对后端百亿的存储数据和前端每天百万次的实时查询,只有查询引擎足够强大,才能保证数据魔方的平稳运行。


AdMaster查询引擎,针对数据魔方业务场景特别开发,支撑其所有的分析功能,高峰期支持上百的QPS,所有查询都能实现秒级内响应,对于高复杂度的自定义查询也不例外。


每一次的查询条件由查询规则、查询时间、平台类型、统计维度、数据指标和过滤条件六大部分组成。查询规则中定义了需要搜索的关键词,查询时间可以支持最近两年内任意时间范围,平台类型包含微博、微信、新闻、论坛等10多种常见的社交平台,统计维度支持时间、地域、行业、品牌、类别等100多种,数据指标支持声量、阅读量、评论量、点赞量等20余种,过滤条件支持所有维度。以上所有的查询条件组合,均能在秒级内返回结果。



6大功能模块相辅相成,

保障每次查询稳定输出


查询引擎共由6大功能模块组成,分别是规则管理模块、解析模块、缓存模块、管控模块、权限模块及日志模块,各个模块相辅相成,保证了每次查询的稳定输出。


规则管理模块

规则灵活,精准定位所需数据


规则是查询中最核心的依赖条件,社交舆情都是基于关键词进行分析。规则中定义了分析时需要包含的关键词、排除的关键词,以及需要搜索的文本范围,同时还可以附加过滤条件过滤某个数据字段的值。多个关键词之间可以支持与、或、非逻辑。规则隶属于规则组,一个规则组下可以包含多个规则。规则可以保存下来复用,多个规则可以组合成一个新的规则。查询时可以选择一个规则组下的多个规则,也可以选择多个规则组下相交叉的规则。规则的灵活性使得在搜索时可以精确覆盖到要分析的数据。


解析模块

读懂需求,与ES匹配对接


在一次查询中涉及的查询规则、查询时间、平台类型、统计维度、数据指标和过滤条件可以自由选择组合,平台类型、统计维度、数据指标支持的值可以选择一个或者多个,过滤条件支持多个条件之间与、或组合。维度还可以支持自定义,可以将定义好的规则做为维度来查询。解析模块会对所有的查询条件参数进行分析,把和过滤相关的条件组合在一起,聚合相关的条件组合在一起,最终转换成Elasticsearch的DSL查询语句。


缓存模块

读懂需求,与ES匹配对接


每次查询请求成功后,缓存模块会将幂等的查询结果缓存在Redis中,以查询条件的hash值做为key,将查询结果保存在value中,Redis中会缓存半个小时内的查询结果。当查询请求过来时,会先根据查询条件查找缓存,如果命中,会从缓存中取出结果返回,这样可以让半小时内的相同查询结果快速返回,提升查询的并发处理能力。

 

管控模块

三大策略防止查询崩溃


数据魔方中的查询都是复杂的分析查询,一个查询规则中可能会涉及上千个关键词,为了避免高峰期,查询量太大导致系统崩溃,管控模块使用了三种策略。

   

▶ 第一种是进行并发控制,同一账号控制并发查询量,所有账号再控制总的并发查询量;


▶ 第二种策略对所有的查询进行分类,先预估查询的复杂度,能够快速返回的查询可以直接查Elasticsearch,需要费时的查询进入查询队列,控制复杂查询的并发量;


▶ 第三种策略定时监控Elasticsearch中查询任务的执行时间,执行时间超过一定阈值的任务,直接kill掉,保证Elasticsearch集群时刻处于健康可用状态。


权限模块

切断非法访问,保证数据安全


权限分为两部分,接口访问控制和数据访问控制,通过这两部分控制可以保证数据不被非法访问,同时控制了数据的访问范围。数据访问通过设置team数据权限来控制。接口访问控制使用两种验证模式组合来控制。


▶ 第一种所有查询请求都会附带access_token,权限模块会对token合法性进行校验,token是在用户登录数据魔方系统时通过标准的OAuth2认证生成的,有效期只有半个小时;


▶ 第二种是白名单机制,设置IP访问白名单,IP白名单的粒度控制在接口上,精确控制每个接口允许被访问的客户端IP。两种验证方式结合验证,保证接口访问的安全性。


日志模块

三大子模块,协同保障系统稳定


日志模块分为跟踪、监控、分析三个子模块:


▶ 跟踪模块会对每一次查询请求进行跟踪记录,记录请求的查询条件、发起时间、运行时长等关键信息,这些信息会记录在Mysql和Elasticsearch中;


▶ 监控模块会对日志进行监控,可以实时查看到系统负载情况和系统运行状态,系统负载过高或者异常时发出报警,让系统运维人员能及时发现


▶ 分析模块会对查询规则进行分析,将高频使用规则转换成标签反馈给标签系统。