在这个版本的研发中,主要演进方向是Pipeline流程动态配置化,将推荐A、B、C业务场景中共性的部分独立,并能独立设置相关属性,做到业务之间代码共享且属性设置隔离。
据此我们演变出了一个配置服务,该服务的主要职责是
管理业务应用程序里的Pipeline执行流程中的细节和实验信息
。同时将计算密集型的模型预测、IO密集型的召回从应用程序里拆分出来,独立成两个服务,使应用程序中的资源集中在业务处理上。
3.0采用配置服务端与客户端,动态配置集中管理的方式,来实现配置化pipeline推荐流程。配置服务端可以动态修改推荐流程和执行属性。配置客户端部署在推荐应用服务器上,与服务端保持心跳,更新配置服务端的流程配置。
当推荐应用服务器接收到用户请求,会交给配置客户端,客户端根据入参找到需要执行的推荐流程,动态生成执行过程,并且在执行过程中使用执行属性,依赖拆解出来的召回服务、预测服务,完成推荐业务流程。面对多样化的推荐场景,这个版本都会表现得游刃有余。
3.0整体框架设计,如图:
下面将从配置服务的四个主要方面阐述3.0的动态配置化推荐系统:
配置服务端与客户端
1、总体设计
推荐配置系统主要含两个端:服务端、客户端。服务端主要功能是配置推荐流程的各个节点。客户端主要功能是拉取服务端配置,在用户请求过程中生成推荐执行流程。具体交互方式见图:
客户端定时轮询请求服务端上传心跳信息,并请求服务端APP应用的版本,服务端接收到请求之后,对比客户端请求合法性,返回相关版本数据。
客户端根据返回的版本信息对比本地的配置版本,相同等待下次心跳,不同发起拉取配置请求。
当服务端接收到客户端的配置请求时,查询当前服务的所有有效配置,组合相应的数据结构,返回给客户端。客户端根据返回的配置更新本地配置,等待用户请求服务,生成业务请求链条。
流程设计,如图:
2、服务端
服务端基础架构如图主要含两大块:对外服务接口和配置管理。
设计,如图:
-
对外服务:
RPC对外服务接口的主要职责是
响应各应用机器的心跳信息及下发应用下的所有满足要求的配置,
主要含心跳响应接口、应用流程查询接口。
-
配置管理:
统一管理到家所有推荐场景的配置,通过在线修改配置可以实时改变推荐策略。
比如feed应用系统,包含了多个场景的feed流,每个feed流可配置属于自己的多版本推荐流程,根据业务可以动态切换。
每个推荐流程又可以自由组合召回、粗排、精排、打散、干预等推荐模块。
结合不同类型的推荐模块和到家业务特点,为模块提供固化的专属配置,方便在线进行业务调整和功能迭代。
3、客户端
客户端的设计思想源于对推荐实际业务流程的规范化,推荐的业务流程是固化的且是有规律的。客户端的流程会按推荐业务的规律化信息,从服务端拉取相关配置后存储在本地。
等待用户请求相关业务后,会根据用户的常规属性(手机型号、经纬度等等)、基础属性、上下文特征、业务方需要的实验信息等,动态的组合一组handler执行单元,然后执行该组单元,完成业务的请求,返回相关业务数据。
客户端通过与服务端保持心跳,同步服务端最新的配置变更,并验证变更配置是否正确。如果正确在下一次用户请求时会被执行,如果错误则忽略这次变更。
客户端主要含有七大模块,其中底层模块两个:核心基础模块、基础扩展模块;业务模块5个:启动模块、服务配置模块、业务解析模块、单元组合模块、执行器模块。
设计,如图:
-
核心层,
我们推荐的业务执行是一个阶段到下一个阶段的过程。比如:从召回->粗排->精排->打散->干预->打包,这个过程是很少会改变的,而且几乎每个业务流程都是如此。
核心基础模块是一个与业务无关的抽象
,根据上面描述的特点。将整个执行逻辑形势抽象成了一个链表,将推荐的各个阶段抽象成了链表上的一个节点(Handler)。
-
基础层,
因为核心基础模块是不支持在节点中执行多个业务的。
但是我们的实际业务是需要这样的功能。
比如召回节点,它是需要多路召回的,所以需要对节点进行这方面的扩展。
-
业务执行层,
解析配置
里的内容,将其组装成可执行的业务链,执行按照业务链顺序执行返回推荐结果。
ab判断能力
ab实验是推荐系统流量的分流核心,推荐迭代必备的度量衡,在推荐系统里的每个阶段使用,并且会不定时做出调整。
在本次重构设计中,把ab属性的能力添加到推荐执行最小单的handler上。配置服务端可在handler上配置ab实验及策略,客户端执行中会根据handler所配置的ab策略选择是否执行业务代码。这样可以带来以下收益:
-
handler进一步和业务解藕,只需要关注单一业务点;