You need to enable JavaScript to run this app.
导航
服务端SDK整体说明
最近更新时间:2024.09.13 10:22:49首次发布时间:2021.02.23 10:41:57

一. 概述

1. 什么时候使用服务端SDK

  • 内容分发算法,如用户打开今日头条以后在feed流中会看见什么内容
  • 由服务端逻辑控制的产品功能,如推送
  • 搜索结果类,如短视频搜索结果呈现的明星大卡样式

总结来看:命中和曝光的逻辑在服务端处理,不需要APP侧植入相关代码,不依赖app发版即可完成

2. 「A/B测试」分流接口和用户行为上报

「A/B测试」在服务端提供了单独的 Java 、Python 、PHP、Go 、Node.js 语言以及分流 agent 来用于实验分流。获取完分流信息后,您可以;

  • 使用SDK中官方自带的接口,自动曝光该实验;后续该用户所有的用户行为,都会参与计算。
  • RangerAppLog SDK 中服务端专用接口上报相应的用户行为 ,作为实验指标。具体信息及示例代码请参考文档

3. 服务端SDK配置

各环境MetaHost地址说明

环境

metahost配置

trackhost配置

SaaS-非云原生(SaaS老客)

无需额外配置

无需额外配置

SaaS-云原生

https://tab.volces.com

https://gator.volces.com

私有化

私有化部署客户为埋点数据上报申请的域名,请根据实际的域名进行替换

二. SDK路由

JAVA SDK

说明

完整 Java SDK引入请查看详细文档:Java SDK

Python SDK

说明

完整 Python SDK引入请查看详细文档:Python SDK

PHP SDK

说明

完整 PHP SDK引入请查看详细文档:PHP SDK

Go SDK

说明

完整 Go SDK引入请查看详细文档:Go SDK

分流 agent

说明

完整分流 agent 使用说明,请查看详细文档:分流 agent

Node.js SDK

1. 下载SDK

下载地址:https://www.npmjs.com/package/@datatester/node-sdk

2. 使用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']) {
 // 
}

三. 常见问题解答

服务端SDK的decision_id和track_id如何传值?

decision_id: 本地分流用户标识,不用于事件上报
track_id/trackId: 事件上报用户标识,用于事件上报,需要替换为客户的真实用户标识
使用场景说明

  • 如果服务端实验都是实名用户,建议decision_id和track_id都使用用户id(uuid)
  • 如果存在匿名用户
    • 同时集成了客户端SDK,建议decision_id为客户端sdk透传过来的ssid;
    • 如果只是单纯集成服务端sdk,做服务端sdk的实验,decision_id为可标识用户的唯一标识即可,比如设备id。

服务端SDK的metaHost和trackHost如何获取,分别代表什么?

metaHost: 获取meta元信息地址,私部一般为系统访问地址;trackHost: 数据上报地址,一般系统部署后提供的部署文档中会有这两个地址,如果未找到对应文档可以找项目经理或者火山服务人员获取。

服务端元信息会存储吗?如果存储会存在哪里?

会存储,存储位置为服务端SDK运行的服务内存里,元信息(包括实验名称、版本分配、目标受众、白名单等)一般很小,不会占用多少内存,服务端元信息默认每隔60s会更新下,这个间隔时间可以修改,如果想修改可以通过 setInterval api修改

服务端sdk支持给匿名用户分流吗?

只有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数据(元信息)指什么数据?

服务端SDK定时会从远程的Meta服务获取到最新的实验元信息,包括实验名称、版本分配、目标受众、白名单等。

服务端SDK请求meta服务,拉取元数据的频次是怎样的?

初始化会请求一次,之后每隔10s会请求1次,这个时间间隔可以通过api自定义设置,参考集成文档setInterval方法使用。

服务端SDK的分流方式?

服务端SDK是本地分流,在初始化的时候会从Meta服务获取最新的实验元信息,包括实验名称、版本分配、目标受众、白名单等,之后再调用activte接口的时候实时分流。

如何使用Redis实现进组不出组逻辑?

可参考下方集成示例,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的网络断了有什么影响?

metahost网络中断,导致不能同步到最新的实验信息,已经获取的不受影响(本地有缓存)
TrackHost网络中断,会导致事件上报失败,能成功分流但服务端不能收到进组信息

metahost和trackhost如果没有域名可以配置ip吗?

可以配置ip,但配置IP的时候需要把端口也配上

通过服务端API上报事件数据,7.14号传13号的数据,当天查看有进组数据,但是指标数据没有?

通过服务端API上传数据,如果local_time_ms是当天的,数据是实时的,如果是非当天的,数据是非实时的,只写元数据,不落实时表,需要次日查看

服务端 SDK的getAllExperimentConfigs方法,描述是“获取用户命中的所有实验的变体详情”,这个所有实验同时包含客户端实验+服务端实验吗?

服务端sdk提供的api只能处理服务端实验,也就是只能获取服务端实验的相关数据

如何测试数据上报地址/trackhost通不通?

使用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中保存的进组不出组的用户信息会冲突吗?

不冲突。进组不出组保存到Redis中的数据结构为 Hash。对应的结构为:
分流ID -> 实验ID -> AB实验VID
decisionID -> perimentId -> ab_vid