当前位置: 首页 > 科技观察

vivo霍金实验平台设计与实践-平台产品系列02

时间:2023-03-11 22:22:40 科技观察

一、前言互联网企业在经历了野蛮生长的发展红利期后,逐渐开始注重产品的科学化、精细化开发,由粗放型向集约型转变.在美国,增长黑客等数据驱动的增长方法论正在帮助谷歌、微软、Facebook等全球科技巨头实现业务持续增长;在中国,通过精细化的数据运算和AB实验分析来驱动有效的业务增长已逐渐成为共识。成为核心手段。其中,A/B测试平台作为典型代表,自然成为国内主流企业不可或缺的核心工具,有效提升流量转化效率和产研迭代效率。过去几年,vivo互联网一直重视科学的实验决策,这意味着对用户的一切改变都必须以相应的实验结论为依据。比如修改置顶广告的背景色,测试新的广告点击率(CTR)预测算法,都需要通过实验来进行,所以一个强大的A/B实验平台非常重要。vivo霍金实验平台(以下简称霍金)从单一系统发展成为解决A/B实验相关问题的公司级一站式平台,助力互联网核心业务快速精准实验,高效推动业务生长。2.项目介绍2.1A/B实验在互联网领域,A/B实验通常是指一种迭代的方法,可以指导如何改进现有的产品或服务。以提高某商品的订单转化率为例,在AB实验中,我们设计了一个新的订单页面。与原来的页面相比,页面布局和文案都进行了调整。我们将用户流量随机分为A/B组(分别对应旧页面和新页面),50%的用户看到版本A的页面,50%的用户看到版本B的页面。一段时间后观察统计发现,A版用户下单转化率为70%,高于B版的50%。然后我们得出版本A运行良好,然后将新页面推送并显示给所有用户。以上是一个使用AB测试迭代产品功能的具体应用。我们将A/B实验的完整生命周期分为三个阶段:实验前,明确改进目标,定义实验指标,完成相关功能的开发和上线;实验过程中,制定各实验组的流量比例,根据导流比例开通在线流量进行测试;实验结束后,评估实验效果并做出决定。2.2分层实验模型霍金的分层实验模型参考了谷歌发表的重叠实验框架论文:《??Overlapping Experiment Infrastructure: More, Better, Faster Experimentation??》来完成设计。2.3平台开发及其在vivo业务中的应用和价值。霍金于2019年发射,经过三年多的发展,目前平均每天的实验次数已经达到900多次,高峰期1000+。支撑vivo境内外业务,服务于公司20多个部门。通过标准化实验流程,降低实验门槛,提高实验效率。使用自动化数据分析工具,辅助业务快速决策,提升产品迭代速度,有效助力业务发展。平台能力的复用避免了不同组织的重复建设,有效提高了生产效率。3.霍金系统架构3.1【实验人员】实验人员包含多个角色,供业务方在霍金管理后台进行实验、指标管理和实验结果分析。3.2【实验门户】包括实验管理和实验效果分析两大功能。3.2.1实验管理平台为业务方提供可视化页面进行实验配置、导流策略选择、流量分配和白名单管理。3.2.2实验效果分析包括以下四大核心能力:1.指标管理不同的实验关注不同的指标。为实现效果自动评估,平台提供指标配置和集成能力。【必看指标】:通常是业务的核心指标。每个实验都需要保证没有明显的负指标。平台集成了大数据指标管理系统,这些指标的结果直接被指标管理系统的数据服务复用。【个性化指标】:通常是实验中临时分析的指标,比如一个banner风格的实验,观察指定banner的点击率。平台提供自定义指标配置能力,通过大数据计算平台自动生成计算任务,实现自定义指标自动生成数据的能力。2.比较分析效果评价及意义结论的直观展示。平台沉淀了对比分析、显着性结论等可视化组件。非常直观的告知实验者各个实验方案相对于控制方案的整体提升率以及每天的涨跌幅。同时给出了该指标的置信区间和显着性结论。3、AA分析平台提供的AA分析目的是帮助实验者验证不同方案实际进入实验的人的核心业务指标是否存在显着差异,辅助实验者判断是否实验结论可靠。4、实时流量分布监控,可以直观的看到实时流量分布的效果,可以人工干预,及时解决流量异常。3.3【实验分发服务】1、多端接入服务平台根据业务的不同需求,提供丰富的接入能力,如Android客户端AndroidSDK,服务端JAVASDK,基于NGINX分发的H5实验服务,dubbo/httpService,待构建的C++SDK。2、实验导流方式平台提供稳定、高效的在线实时导流服务。【随机拆分】:基于哈希算法,根据用户标识对人群进行随机分组拆分【指定人群拆分】:在实验前划定一组人,并标记他们进行拆分【Covariateuniformsplit】:基于哈希算法在对人群进行随机分组时,虽然分组人数按等比例划分,但分组分布的指标并不均匀,导致实验效果达不到预期。为了解决这个痛点,平台推出了协变量平衡算法,可以保证人群以统一的样本量分组,指标在人群上的分布也是均匀的。详见本文:4.vivo霍金实验平台实践→4.1协变量平衡算法详解。【基于openresty的web服务分发】:针对非JAVA服务端对性能有严格要求的业务方,我们在NGINX中使用lua脚本实现了一套基于OpenResty的实验性分发功能,通过http接口提供服务,平均响应时间小于1ms,p9999<20ms。3.4【配电数据处理服务】使用公司统一的数据采集组件对配电数据进行采集和处理,最终存储在HDFS中。3.5【指标计算服务】采用独立服务高效计算指标结果,并配备指标计算失败重试和监控告警机制,有效保证指标计算的成功率。3.6【数据存储】主要使用MySQL存储业务数据,同时实验配置使用Ehcahe作为主缓存,Redis作为辅助缓存。最后将实验拆分后的数据进行处理,存储在HDSF中,供后续实验数据Analytics使用。4.霍金的实践上面介绍了霍金的发展历程和整体系统架构。接下来介绍平台开发过程中遇到的问题及相应的解决方案。4.1协变量平衡算法4.1.1遇到的问题业务方在对实验对象进行分组时,最常见的方法是根据实验对象的某个属性进行哈希然后取模100,根据结果进行分组.hash算法的分布虽然可以实现尾数段的均匀分布,但是在分组完成后,可能会出现不同组内实验对象在某些指标特征上分布不均,导致实验效果评价不准确的情况。如下图(图中四种不同的颜色代表不同的人群和对应的指标类型):有没有办法实现人群的统一分组,同时保证人群对应的指标分布是一致的?也均匀,如下图所示:4.1.2解决方案1.CovariateBalanceAlgorithm该算法可以保证群体均匀分组,群体对应的指标分布也均匀。整体由三部分组成,示意图如下:(1)线下分层抽样需要经过以下三个步骤:与业务方确定核心指标,采用等比例分层+Kmeans聚类模型完成指标对应的用户分层抽样。分层抽样的数据写入到hive库的相关表中。这里介绍下等比例分层抽样等比例分层抽样:第i层应抽取的样本数;第i层的样本总数;N是可用流量总量;n本实验设置的流量样本数假设N为3kw,n为50w。按照以下维度分类:一共有9个组合,确定每个组合占总数的比例(总N=3kw,通过从所有可用流量中筛选特定人群):计算每一层的样本数公式;分类对应的样本数(总样本量60w):至此整个离线分层抽样工作已经完成,接下来介绍实时均匀分组。(2)实时统一分组需要经过以下四个步骤:数据同步将准备好的分层采样数据从hive数据库相关表通过配置的定时任务同步到redis,数据包括每日用户标识(uid,下同)映射到层级,每个层级每天的用户占比。实验创建使用每个实验组的实验编号、实验组编号和样本大小创建一个实验。创建的实验会关联最近一天的用户数据,本层各实验组的样本量可由样本量*层用户占比确定。实验分布利用实验编号和用户标识(uid)先找到用户所在层,然后将用户平均分布到该层下的实验组,保证用户分布在不同层的实验组之间是偶数。如下图所示:用户数据删除由于我们采用的方案需要每天同步大量的数据,因此需要及时删除无用的用户数据,以提高资源利用率。实时统一分组的整体流程图如下:在做实时统一分组的时候,我们面临着性能和存储的压力。为此,我们分别设计了高性能的分发方案和高内存利用率的用户信息存储方案。高性能分布方案我们使用不同的redis数据结构和lua脚本来完成层下bucket的均匀分布。方案一预先分配了每个桶的样本量,每次选择当前样本量最大的桶。Redis结构:HASH,field是对应的桶号,value是桶对应的当前样本量。方案2预先分配每个桶的样本量,每次选择当前样本量最大的桶。Redis结构:SORTEDSET,key为对应的桶号,score为对应的桶当前样本大小方案3使用当前层样本大小和桶大小的模来选择命中的桶Redis结构:HASH方案1:有当只有两个bucket时性能最高,是方案3的1.05倍,但其性能随着bucket的增加而线性下降。方案二:性能稳定。方案三:性能稳定,但是性能是方案二的1.12倍,是单个GET请求性能的58%。考虑方案3.内存利用率高用户信息存储方案设计uid层内存消耗对比方案一:使用redis字符串存储。方案二:分成10000个hash存储。方案三:分成10000个一级桶,每个桶有125个二级桶。假设uid为15位,layerid为2位,考虑过期时间,不考虑cluser模式的额外消耗,不考虑malloc内存碎片和占用。考虑方案3。(3)离线分析和验证由于协变量算法的实验过程比较复杂,我们仍然采用人工采集数据的方法来分析实验效果。4.2JavaSDK4.2.1遇到的问题早期的JavaSDK能力较弱,只提供卸载,需要接入端上报卸载结果数据,接入端修改成本较高;所以当时Dubbo接口主要用于对外的分流服务,在服务内部,平台服务器会统一上报导流结果数据。随着接入方越来越多,Dubbo线程池频繁耗尽,或者由于网络原因导致导流失败,导致导流体验不佳,影响实验结果分析;除了性能优化,还需要不断扩充应用服务器等资源,造成了一定的资源浪费。4.2.2解决方案针对上述情况,霍金开发团队在深入研究技术方案后,对JavaSDK进行了多次升级,成功解决了上述问题。目前拥有实验拆分、拆分结果上报、实验配置实时增量更新、SDK自监控等核心功能,大大提高了拆分的稳定性和成功率。4.2.3SDK6核心能力1.分发结果上报依托公司SDK中的数据采集组件,对分发结果进行上报。2、分发结果上报失败的自下而上的解决方案在进行分发上报时,由于数据链路不能保证100%的数据完整性,如果宕机,业务服务异常,网络异常等.,实验数据分布未能报告,直接影响实验效果的分析。如何保证100%的实验分流数据在任何情况下都不会丢失。为此,霍金实验平台设计了一套分流数据离盘方案,作为异常场景的自下而上的措施,从而保证数据100%的完整性。设计图如下:3.实验配置实时&增量更新除了通过定时任务将实验配置拉取到业务端本地缓存外,还提供实时增量更新,适合针对实验性配置变更时效性要求高的业务。通过开关控制,动态生效。默认采用实时增量更新+定时全量更新,方便业务方灵活使用。下面是配置实时和增量更新的流程图:针对实时更新失败的情况,我们设计了失败退避策略:采用指数失败退避策略,默认长轮询间隔为1s,每次失败间隔增加2倍,最大为60,所以增长顺序为1、2、4、8、16、32、60;每次成功设置间隔为1。另外,我们保证了数据的最终一致性,保证SDK在拉取配置的时候,最终能拉取到最新的配置,不会有配置回滚:实验信息和模块信息缓存是线性的。相同变化的实验信息缓存的刷新在模块信息缓存的刷新之前(发送缓存刷新消息时,保证实验缓存刷新消息在模块缓存刷新消息之前)。刷新模块信息缓存时不会出现版本号跳转问题(缓存方法输入版本号,刷新缓存时将数据库版本号与传入的版本号进行比较,如果版本号不一致,则打印日志并使用传入版本号作为此缓存刷新的版本号)。SDK拉取配置更新本地配置时,只会更新版本号大于等于本地配置版本号的配置。是)>业务端配置中心灰度配置>业务端配置中心配置>远程默认配置>本地默认配置;业务端配置中心灰度配置是指通过在配置中心配置指定机器ip进行功能灰度。5、采用SDK的痛点之一是,新增功能后,业务方需要相应升级,否则无法使用新功能,影响业务。为此,霍金设计了一套底线解决方案。当SDK中检测到新增策略不存在时,通过dubbo泛化调用访问Hawking服务器,确保分发功能正常;有效保证业务方有充足的时间升级到最新版本,提升用户体验。6、使用SDK进行SDK监控告警的另一个痛点是SDK集成在业务端服务器的进程中,打印的错误信息本身是看不到的。依赖业务方的反馈是非常被动的,不能第一时间跟进处理。解决这个问题;针对这种情况,霍金实验平台设计了一套SDK自监控方案。自行监测数据按时间精度进行预聚合,通过埋地域名上报总监测。自我监控支持国内销售、新加坡和印度环境。通过监控,我们可以直观的看到各个业务、实验、SDK版本等维度是否有错误信息,并根据对应的维度配置告警,方便开发者第一时间跟进解决问题。4.3H5实验4.3.1遇到的问题业界在做H5实验时,通常的做法是开发H5SDK,让业务方前端引入。存在以下问题:业务端前端需要修改代码进行适配。另外,需要对实验的页面或元素进行屏蔽,因为页面跳转对用户体验有一定的影响。当实验功能发生变化时,业务方需要升级H5SDK整个H5实验的接入周期比较长,有一定的接入门槛。4.3.2解决方案那么有没有一种简单快捷的方式,只要接入方在后台配置好实验,就可以完成整个H5实验的接入呢??为此,霍金开发团队设计了一个解决方案,成功解决了这个问题。整个H5实验架构是基于开源的apisix搭建的。业务方在Hawking管理后台创建实验时,所有基于nginx的路由配置通过接口自动下发(配合工单审核),接入方无需在代码层面做任何修改,无侵入,大大提升业务方做H5实验的效率。这里有几个名词解释一下:【PublicVUA】:vivo统一接入。vivo的统一接入层可以理解为替代nginx的后续产品,基于开源的apisix。【霍金VUA】:专为霍金打造的VUA平台。在做H5实验时,公共VUA会将需要测试的页面代理给霍金VUA。HawkingVUA通过开发的HawkingAPISIX插件完成实验分发。【VUA变更平台】:基于NGINX的配置变更,通过平台可视化操作下发到VUA平台(publicVUA/霍金VUA)。(1)H5实验整体时序图(2)NGINX→VUA拆分方案切换PublicVUA将需要测试的页面代理到HawkingVUA,HawkingVUA通过开发的Hawking实验平台拆分APISIX完成实验拆分插入。多版本实验导流1)H5多版本实验引入同一个url作为实验。通过霍金导流,不同用户访问同一个url,但页面访问内容不同(因为多版本实验是将页面版本资源发布到不同的机器上),然后通过霍金实验平台访问不同的资源。2)H5多版本实验拆分原则公共VUA将多版本实验对应的静态资源请求代理给霍金VUA。HawkingVUA使用API??SIX插件根据实验配置选择上游,代理到对应的静态资源服务器。3)流程示意图多版本实验分发多页面实验分发霍金实验平台分发APISIX插件H5实验分发数据采集多页面实验分发1)H5多页面实验引入多个不同的url进行实验,通过霍金分布,不同的用户访问不同的url页面。2)H5多页实验原理公共VUA将多页实验对应的入口业务路径的静态资源请求代理给霍金VUA。HawkingVUA通过APISIX插件根据实验配置改写不同页面的路径。3)流程示意图。霍金实验平台APISIX插件流程示意图如下:插件开发规范参考:https://apisix.apache.org/zh/docs/apisix/plugin-developH5实验数据收集H5实验分流数据存储在HawkingVUA平台的access_log中,通过以下步骤最终存储在HIVE库的DW表中,以供后续数据分析。五、实验效果分析该模块包括指标服务、数据分析及效果展示、准实时指标计算、AA分析等功能,限于篇幅,此处不再展开。6.总结与展望本文主要介绍了体内A/B实验的平台和产品搭建与实践,实现了以下价值和能力:用户可以在平台上完成实验创建-数据分析-决策-调整实验闭环、操作简单、灵活性高;提供科学可靠的多层分流算法,流量可复用,无需发布版本即可快速验证产品方案、运营策略、优化算法;提供实时实验分流监控、小时级指标监控和离线数据分析功能;支持自定义指标,无需等待分析师开发报表,匹配后立即查看。但仍然存在用户体验等问题。未来我们将围绕指标配置(常用指标固化、指标配置简化)、数据展示(交互优化、多维分析、归因分析)等实验流程和数据服务功能进行优化和优化improve,不断提升用户体验。参考资料:OverlappingExperimentInfrastructure:More,Better,FasterExperimentation滴滴数据驱动Java?Servlet规范中AB实验的应用(2.3.3.3异步处理)Github:apolloapolloconfig/apolloAPISIX文档APISIX插件开发文档openresty文档