百度网页搜索核心模块重构

2020-02-27 389浏览

  • 1.网页搜索核心模块重构 2014.6~至今 网页搜索部 & 工程效率部 冯上 马波
  • 2.C模块 - 位置 Web服务器 上游模块… C Query分析 召回控制器 搜索模块 搜索模块 摘要 召回控制器 搜索模块 搜索模块
  • 3.模块C • 多产品支持 • 网页搜索 • 移动搜索 • 知道/贴吧/文库 • 开发密集 • 每周上线10-20个功能 • 最近1.5年有206人贡献过代码
  • 4.内容简介 项目背景 阶段性成果 我们如何做 设计层面、编码层面、工具层面
  • 5.项目背景 模块接连出现上线回滚 一个月6次 代码复杂难以维护 复杂度高 系统性错误难以排查 内存、指针、core
  • 6.项目阶段性成果 Query分析交互部分全部OO化 面向对象的设计,接口清晰,职责明确 搜索控制器交互状态机重新设计 逻辑清晰化,复杂度降低,内存下降,性能提高 单元测试覆盖率提升、代码复杂度下降 类平均大小降低25%,平均圈复杂度下降10% 清除无用代码 2.6W+ lines
  • 7.我们如何做 指导思想 小步快跑、演进式设计、SOLID原则 实现细节 设计层面、编码层面、工具层面
  • 8.设计层面 架构:混乱/messy  清晰/clear and focused 初级OO/basic OO  设计模式/design pattern
  • 9.架构:混乱/messy  清晰/clear and focused
  • 10.控制框架 词性分析请求 Queryanalyze.cpp 总控逻辑 QueryAnalyzer QueryControl 通过A平台发送请求 通过B平台发送请求 AsyncSubmitterA AsyncSubmitterB AsyncSubmitter 构造词性分析请求 解析词性分析结果 QueryControl get_normal_query_type 根据当前召回状态 筛选要执行的 get_next_query_type query_type 与词性分析交互 不再参与 词性分析交互 RequestBuilder QaRequestBuilder PackParse PackParser makeDaRequest_strategy() QaResponseParser parseDaResponse_strategy() ResponseParser 退出与词性分析 交互
  • 11.
  • 12.StrategyQueue -search ResultFetcher search -Cac******irer* -Ca******ta* -QueryTy********ata* -Req*****Array -_*******en_cache -Pack****ager -char buf[] -lost_bs_arr_t -_search*****ueryType -_nee***archCac****vel -_sendAn*********neBc -sen********ertOneDBArr -_sendA********ostDB …… …… 缓存查询Proxy 后端查询Proxy Normal Specific1 Specific2
  • 13.Queue ResultFetcher RecallInfogetResults::recallinfo processAfterRecall -RecallInfo*_m_recall_array[]XXCallback::on_successcheck_*****_old_strategy -RecallInfo*_m_recall_array[] check_db_**** check_*****_old_strategy -RecallInfo*_m_recall_array[] mask_*****sults check_db_**** check_*****_old_strategy Upd**********es_num mask_*****sults check_db_**** modify_***results_layout Upd**********es_num mask_*****sults merge_and_save_***_result modify_***results_layout Upd**********es_num merge_and_save_***_result modify_***results_layout merge_and_save_***_result RecallInfo -finish TypeResult RecallInfo
  • 14.
  • 15.
  • 16.初级OO/basic OO 设计模式/design pattern
  • 17.Template Method StrategyQueue parse_response QueryHighRisk QueryHighRisk QueryHighRisk SpecialQueryB SpecialQueryA parse_response
  • 18.StrategyQueue StrategyQueue find_query parse_response parse_response SomeStrategy SomeStrategy find_query find_query SomeStrategy parse_response parse_response parse_response ElseStrategy QueryDiyukuozhan find_query ElseStrategy find_query ElseStrategy parse_response find_query parse_da_response parse_response parse_response Bridge QueryFinder find_query AnotherStrategy QueryDiyukuozhan find_query QueryDiyukuozhan find_query QueryDiyukuozhan parse_response find_query AnotherStrategy parse_da_response find_query AnotherStrategy parse_da_response find_query parse_da_response parse_response parse_response NormalFinder find_query AnotherFinder find_query OtherFinder find_query
  • 19.编码层面 长函数/long method  抽取方法/extract method 控制结构重复/duplication  工具类/utilities 构造单测数据  使用辅助工具/UT fixture
  • 20.长函数/long method  抽取方法/extract method
  • 21.Interaction with Query Analysis – Before refactoring
  • 22.Interaction with Query Analysis – After refactoring convert_query 1 1 初始化 request 2 Get query analysis service 3 通过Scheduler提交callback 4 更新签名 5 更新cachePattern:Composed Method 均匀一致的抽象层次 2 3Lines:261  ~10 4 5
  • 23.控制结构重复/duplication  工具类/utilities
  • 24.
  • 25.Void f() { timeval ts, te; TimeData* pTimeData = NULL; GET_DATA(TimeData, pTimeData); gettimeofday(&ts, NULL); …… // 处理逻辑 gettimeofday(&te, NULL); pTimeData->parse_da_time += (te.tv_sec ts.tv_sec) * USECS_PER_SEC + (te.tv_usec ts.tv_usec); } Void f() { TimeRecorder(&(time_data()->parse_da_time)); …… // 处理逻辑 } XXCallback -- timeval _parse_start; -- timeval _parse_end; 在下列函数每一个出错的分支和最后成功的地方都要做 gettimeofday计算时间XXCallback::on_success()'>XXCallback::on_success()