ABT智能决策,达到自行运转的决策循环,降低产品A/B实验决策周期、成本,助力业务增长。为实现这个目标,我们对客户端ABT、数据埋点、首页动态化进行了重构设计。本文主要分享我们对ABT改造实践相关技术点:客户端ABT架构设计、ABT协议规范、ABT埋点。
概述
关于A/B 有很多层的定义,通俗来说,A/B 是一种工具,通过分流A和B两个版本,统计埋点数据,进而实时计算出对应版本关键指标数据,然后根据指标数据和算法策略自决策哪个A/B版本效果更好并调整对应版本的流量。
架构设计
对于客户端视角来说架构体系主要划分:业务模块层、APP内H5、APP埋点、业务请求、APP Server、ABT Server。
-
ABT SDK:生命周期内缓存实验决策信息,为业务模块解析决策信息、匹配业务埋点对应实验信息、匹配业务请求的实验透传后端。
-
埋点:用户的行为数据的采集&上报。
-
APP内h5:对于APP内的H5页面 为保持与APP实验决策表现的一致性,SDK通过UA传递实验决策给h5页面。
-
APP Server:透传ABT服务实验决策列表,apolloY配置参与实验的业务接口Path。
-
ABT Server:创建ABT实验,提供原始的实验决策信息并透传实验的业务信息。
ABT协议规范
为了保证资源投放、客户端、app Server服务、ABT服务、数据埋点服务,这些服务都保持一套页面模块体系 ,约定了一套ABT协议规范,并且各个服务都遵循这套协议,然后ABT各种实验玩法(TAC/资源投放/纯客户端实验)都是在这套协议上运行。
$(ABT协议版本号)|$(页面)|$(模块)|$(位置)|$(服务标识)|$(实验ID)|$(方案ID)。
-
第一位: 协议版本号,预留,防止后面扩展或者修改协议用,示例1,由ABT平台提供,各方统一
-
第二位: 页面,如首页,示例index,这个标识符由页面模块管理服务提供,各方统一,没有该项,则为NULL
-
第三位: 模块,如banner位,示例BANNER, 这个标识符由页面模块管理服务提供,各方统一,没有该项,则为NULL
-
第四位: 位置,如1,2,3, 应该由页面模块管理服务提供,各方统一,没有该项,则为-1
-
第五位: 第三方服务标识, 如RDC,表示资源投放系统,这个标识由ABT平台提供,各方统一
-
第六位: 实验ID,ABT平台上创建的实验的id
-
第七位: 方案ID, ABT平台上创建的方案id。
例如 对于首页里的banner模块里的第二个坑位需要进行资源投放实验,那么对应的ABT协议ID为 1|index|banner|2|RDC|002|001。
{"type":0, //端类型, 0 native实验, 1 h5实验
"groupId":"1|index|banner|2|RDC|002|001", //实验ID,
"extend":"", //ABT透传业务字段
"paths":["/api/tac/execute/index"] //当前实验涉及的接口path列表 ,约定path不带.json后缀
}
ABT埋点
ABT实验埋点粒度支持模块粒度、页面粒度、全局粒度、坑位粒度(目前主要是资源投放场景实验)的埋点。并且实验埋点信息是根据页面模块自动匹配 然后随当前埋点一起上报。
-
模块级别实验,模块里埋点只会带上与该模块相关的实验信息(实验ID_方案ID),主要作用于模块内的实验。例如menu模块内埋点只会带menu模块相关的实验信息 。
-
页面级别实验, 页面内所有埋点会带上与该页面相关的实验信息,主要用于页面内跨模块的实验 。如首页TAC实验需要跨首页多个模块。
-
全局实验,整个APP内所有埋点都会带全局实验信息,主要用户跨页面实验。比如交易链路实验需要涉及到购物车页、下单页多页面。
例如 当前ABT SDK缓存的ABT决策列表:
["1|index|newitem|2|TAC|002|001", //模块级别实验
"1|index|newitem|3|TAC|003|004", //模块级别实验
"1|NULL|NULL|2|TAC|005|006", //全局实验
"1|index|more|2|TAC|007|008"] //模块级别实验
对于首页的新品模块的商品点击埋点click_index_newitem_item对应页面是index、模块是newitem,那么该埋点匹配到对应的实验信息是 "002_001|003_004|005_006" 。
资源投放实验埋点
资源投放ABT埋点比较特殊,对于客户端来说这种实验基本上是透明的,并且实验的粒度到模块的坑位级别。实验的埋点信息都是随业务接口返回 然后在对应坑位埋点直接透传埋点服务。
-
资源投放ABT直接访问ABT平台
-
资源投放ABT埋点 接口返回SCM埋点信息
ABT首页落地
对于首页TAC实验场景来说,由于首页页面模块UI布局&数据都是在后端TAC服务进行组装页面,所以对于这个场景SDK不仅为客户端提供实验决策也需要提供实验决策给后端TAC服务。
对于TAC 服务决策信息我们在业务请求通过WZP Header传递给后端TAC服务,然后TAC服务根据header里的决策信息组装好对应版本的页面数据返回给APP。
例如线上已完成下线的一个实验,首页的TAC布局实验测试。
实验A版本模块顺序:超级会员专属福利 -> 首页私人定制模块 - > 首页人气推荐模块;
实验B版本模块顺序:首页人气推荐模块 -> 超级会员专属福利 -> 首页私人定制模块。
总结展望
截止目前严选已经上线了78个客户端实验,包括首页TAC布局实验、首页TAC样式实验、资源投放实验、商详实验等。
随着用户数据隐私的管理越来越严,并且手机设备性能越来越好,未来我们期望结合On-Device AI技术充分利用手机设备算力资源、节省云端资源。在某些业务场景下,让数据不出手机端直接在端内进行决策。
作者简介
胡大,网易高级iOS开发工程师。2016年硕士毕业于上海计算技术研究所,同年加入网易严选,参与严选业务开发,现阶段主要负责导购链商品评价、交易链购物车两大业务模块开发。同时负责严选客户端APM、网络基础设施建设。目前参与严选Flutter技术建设落地。
本文由作者授权严选技术团队发布
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Servlet与JSP核心编程
(美国)霍尔等著、赵学良译 / 霍尔 / 清华大学出版社 / 2004-06-01 / 59.0
《Servlet与JSP核心编程》(第2版)叙述详尽,条理清晰。对于初学者来说是一本不可多得的入门书籍,经验丰富的Servelet和JSP开发人员也可以通过阅读《Servlet与JSP核心编程》(第2版)得到巩固和提高。一起来看看 《Servlet与JSP核心编程》 这本书的介绍吧!