在某些场景下,实验的内容几乎发生在后端服务(比如Feed流推荐策略、付费金额选项等),此时在后端进行分流是最合适的。
「A/B测试」在服务端提供了单独的 Java 、Python 、PHP、Go 、Node.js 语言以及分流 agent 来用于实验分流。获取完分流信息后,您可以;
各环境MetaHost地址说明
环境 | metahost配置 | trackhost配置 |
---|---|---|
SaaS-非云原生(SaaS老客) | 无需额外配置 | 无需额外配置 |
SaaS-云原生 | https://tab.volces.com | https://gator.volces.com |
| 私有化部署客户为埋点数据上报申请的域名,请根据实际的域名进行替换 |
说明
完整 Java SDK引入请查看详细文档:Java SDK
说明
完整 Python SDK引入请查看详细文档:Python SDK
说明
完整 PHP SDK引入请查看详细文档:PHP SDK
说明
完整 Go SDK引入请查看详细文档:Go SDK
说明
完整分流 agent 使用说明,请查看详细文档:分流 agent
下载地址:https://www.npmjs.com/package/@datatester/node-sdk
const abClient = new AbClient("token") const attrs = new Map() attrs.set("key", "value") const config = testerClient.activate("key", "decisionId", "trackId", attrs, {val: "defaultValue"}) const value = config.val if (value === 'xx') { // 命中xx } else if (value === 'yy') { // 命中yy } else { // 兜底 } // json类型 const jsonValue = JSON.parse(value) if (jsonValue['key']) { // }
decision_id: 本地分流用户标识,不用于事件上报
track_id/trackId: 事件上报用户标识,用于事件上报,需要替换为客户的真实用户标识
使用场景说明
metaHost: 获取meta元信息地址,私部一般为系统访问地址;trackHost: 数据上报地址,一般系统部署后提供的部署文档中会有这两个地址,如果未找到对应文档可以找项目经理或者火山服务人员获取。
会存储,存储位置为服务端SDK运行的服务内存里,元信息(包括实验名称、版本分配、目标受众、白名单等)一般很小,不会占用多少内存,服务端元信息默认每隔60s会更新下,这个间隔时间可以修改,如果想修改可以通过 setInterval api修改
只有java,go,php版本SDK支持给匿名用户分流,注意使用需要严格参考帮助文档的匿名用户接入说明,以java 为例匿名用户,trackid为空字符串,并且需要通过setDeviceId或者setWebId方法设置设备id。
注意:saas需要使用setBdDid方法
User user = new User.UserBuilder().create("decisionID", "") // trackId有值设置对应的值,没有值设置空字符串 .setDeviceId(6981329701821561868L) //私有部署使用此方法 .setWebId(7018215618686981329L) //Web及小程序使用此方法 .setBdDid("H5PPHTEHXLMEGCGROGLY2343242M2LMFIMQE4VIRW76HKYWH4Q01") //saas使用此方法 .build();
服务端SDK定时会从远程的Meta服务获取到最新的实验元信息,包括实验名称、版本分配、目标受众、白名单等。
初始化会请求一次,之后每隔10s会请求1次,这个时间间隔可以通过api自定义设置,参考集成文档setInterval方法使用。
服务端SDK是本地分流,在初始化的时候会从Meta服务获取最新的实验元信息,包括实验名称、版本分配、目标受众、白名单等,之后再调用activte接口的时候实时分流。
可参考下方集成示例,redis实现
/** * 实现 UserAbInfoHandler 接口,并实现接口中声明的方法 * 进组不出组,Redis实现。 */ public class NotOutGroupRedisImplement implements UserAbInfoHandler { /** * 存储分流结果 * @param userId 用户ID * @param hashMap 分流结果参数和值,key=分流参数,value=对应版本的标识 * @return */ @Override public boolean createOrUpdate(String userId, HashMap<String, String> hashMap) { long res = 0 ; for (Map.Entry<String, String> entry : hashMap.entrySet()) { res = JedisUtils.getJedis().hset(userId, entry.getKey(), entry.getValue()); } return res > 0 ; } /** * 查询用户对应的分组 * @param userId * @return 用户对应的分流结果 key=分流参数,value=对应版本的标识 */ @Override public HashMap<String, String> query(String userId) { Map<String, String> resMap = JedisUtils.getJedis().hgetAll(userId); return (HashMap<String, String>) resMap; } }
在AB分流代码中配置进组不出组的逻辑
AbClient abClient = new AbClient.Builder(appKey).build(); NotOutGroupRedisImplement notOutGroupHandler = new NotOutGroupRedisImplement(); abClient.setUserAbInfoHandler(notOutGroupHandler); Variable variable1 = abClient.activate("variantKey", user, defaultValue); java
metahost网络中断,导致不能同步到最新的实验信息,已经获取的不受影响(本地有缓存)
TrackHost网络中断,会导致事件上报失败,能成功分流但服务端不能收到进组信息
可以配置ip,但配置IP的时候需要把端口也配上
通过服务端API上传数据,如果local_time_ms是当天的,数据是实时的,如果是非当天的,数据是非实时的,只写元数据,不落实时表,需要次日查看
服务端sdk提供的api只能处理服务端实验,也就是只能获取服务端实验的相关数据
使用curl命令验证,需要修改命令中的appkey(为应用的appkey),xxx.com域名和local_time_ms为当前时间戳即可
saas:https://mcs.ctobsnssdk.com
私有部署:使用数据上报地址域名即可
注意:注意:配置trackHost时,只要域名,域名后面不要以 "/" 结尾。
curl -X POST -H "Content-Type: application/json" -H "X-MCS-AppKey: appkey" -d '{"user":{"user_unique_id":"XXX"},"header":{"app_name":"xxx"},"events":[{"event":"predefine_pageview","params":"{}","local_time_ms":1630467848888}]}' https://XXXX.com/v2/event/json
不冲突。进组不出组保存到Redis中的数据结构为 Hash。对应的结构为:
分流ID -> 实验ID -> AB实验VID
decisionID -> perimentId -> ab_vid