推荐工程-策略平台

对推荐和搜索业务处理通过DAG图可视化方式组织,提供统一对外服务接口、DAG图执行引擎,处理如并发执行、日志上报、监控等业务无关需求,让使用者可专注于业务开发

背景

随着公司业务的发展,有越来越多的业务场景需要接入推荐,推荐场景最初的开发模式是推荐算法和工程同事根据需求开发完成推荐接口,最后与业务服务端同事进行对接,在这个开发模式下遇到了众多问题:

  • 针对不同推荐场景需要单独开一个接口,接口协议按需制定,每开发完⼀个接口都要重新对接⼀遍

  • 每个推荐场景内的处理流程是个黑盒,众多处理逻辑耦合在⼀起,重用困难,开发非常耗时

  • 针对较复杂的推荐场景往往会有很多处理逻辑,为了保持接口性能,需要考虑并发处理等非业务相关的功能,无法专注于业务开发

  • 推荐逻辑多而杂,仅以接口为粒度的监控太粗,难以定位接口内耗时较多的逻辑,优化受阻;针对部分逻辑(如某一路召回)无法在出错时做熔断处理,导致因部分出错而影响到整个接口的响应

为解决以上问题,工程同事推动了策略平台的建设,期望满足以下核心诉求:

  • 推荐服务对外抽象出⼀个通用接口,与业务方只需对接一次接口协议

  • 每个推荐场景通过DAG图方式组织执行,由一个个逻辑处理模块组成,处理流程可视化,模块可复用

  • 提供统一的DAG执行引擎,处理并发、日志上报等非业务相关的功能,让开发者可专注于业务开发

  • 提供统一的监控、分析功能,为性能优化提供指引,支持针对单一模块、单一业务场景的熔断,以保证接口正常运行

平台架构

%E6%8E%A8%E8%8D%90%E7%AD%96%E7%95%A5%E5%B9%B3%E5%8F%B0.png

核心功能

业务场景管理

业务场景是用来表示某个推荐的场景或构成推荐的部分逻辑,比如综合-首页推荐(推荐场景)、固定位-首页固定位召回(推荐的部分逻辑)等,调用方会通过业务场景来识别具体的推荐。

PS:在平台接入多个不同项目(App)后,业务将对应于某个App,场景则对应于App下的不同推荐场景

业务场景列表页:

Untitled.png

项目管理

以上的业务场景只是描述了某个推荐的场景,具体在推荐做了什么事,则是由项目来说明的。项目中核心的组成部分是模块/模块实例,每个项目由众多个模块/模块实例组成一个有向无环图,完成一个推荐场景(部分逻辑)所做的事情。

项目列表页:

Untitled.png

项目编辑页:

Untitled.png

模块管理

模块是项目中执行业务逻辑的最小单元,每个模块对应到项目代码中的某个类,模块的key为类的名称,模块可附带一些自定义的参数,方便在运行过程动态修改。 PS:为解决同一模块可在同一项目中存在多个,引入了模块实例,模块实例可完成的功能与它依赖的模块一样,可简单理解为是多带了标识的模块。

模块列表页:

Untitled.png

模块编辑页:

Untitled.png

推荐模拟

推荐模拟是用来模拟调用推荐接口的一个工具,通过调用推荐的rpc接口,可查看到推荐返回的结果,方便测试、检验推荐效果等。

模拟推荐页:

Untitled.png

日志查询

日志查询提供了查看推荐过程及状态的功能,可查询某个用户的推荐,便于开发测试验证以及辅助定位线上问题等。

日志查询页:

Untitled.png

模块数据

模块数据可实时查询每个业务场景、模块的耗时情况,也可查看两者的历史耗时情况,便于做性能优化。

模块数据页:

Untitled.png

展望未来

因平台是从0到1构建的,初期为满足业务需求,平台与其他平台或业务存在较多的耦合,以至于整体功能/架构比较臃肿,且部分实现未考虑周全,现平台已逐步稳定运行,未来可考虑在以下方面进行进一步优化:

  • 优化整体架构,往可插拔的架构发展,平台核心只提供统一的DAG执行引擎,其他部分功能可通过插件按需扩展

  • 沉淀一些可复用的模块,供各业务场景使用

  • 提供模块热更新等动态加载功能,减少更新服务的频率

加载评论