本地分流为高级功能,需要A/B Testing 版本在1.0.0以上,且在使用本SDK之前联系神策技术支持开通该功能。
本地分流 Java A/B Testing SDK 依赖神策分析 SDK 3.2.0 及以上版本。在使用前请确保已经成功集成神策分析 SDK,并进行了 SDK 初始化,详情可参考 SDK集成(Java).
本地分流 Java A/B Testing SDK 需要 JDK 1.8+,引用 guava 18.0 版本。
本地分流
定义
将分流算法集成在神策A/B SDK(即神策A/B Testing 本地分流SDK,为服务端SDK)中,当C端用户请求业务服务器时,直接在业务服务器上完成分流并将结果下发给用户,无需实时请求A/B SaaS分流服务。
计算规则
- 同时满足以下条件的试验会在SDK本地计算分流结果:
- 试验类型为非粘性试验。
- 分流主体为登录ID主体、设备ID主体或自定义ID主体,不支持神策ID。
- 用户筛选条件为全部受众或者基于自定义属性的受众用户筛选。
- 不满足以上任意一个条件,则会远程请求分流服务在线获取分流结果,同时会存在一定的网络延迟。
SDK集成
- 首先需要下载SDK,解压后获得Java SDK的jar文件。
- 在项目根目录下创建lib目录,将下载的Java SDK的jar文件放入该目录中。
以Maven集成为例,在pom.xml中将本地分流Java SDK加入项目,添加依赖,并配置打包策略。
pom.xml
com.sensorsdata.analytics.javasdk SensorsAnalyticsSDK 3.2.0 org.apache.commons commons-lang3 3.8.1 org.slf4j slf4j-api 1.7.25 com.google.guava guava 18.0 com.sensorsdata.analytics.javasdk SensorsABTesting-Local 0.0.2 system ${basedir}/lib/SensorsABTesting-Local-0.0.2.jar org.springframework.boot spring-boot-maven-plugin true XML本地分流Java SDK和A/B Testing Java SDK在您的项目中只能存在一个,若您已接入A/B Testing Java SDK,想更换为本地分流 Java SDK,则需删除之前pom.xml文件中的A/B Testing Java SDK依赖。本地分流Java SDK已包含A/B Testing Java SDK的全部功能。
初始化SDK
本地分流 Java A/B Testing SDK 依赖神策分析 SDK。请确保已经成功集成神策分析 SDK,并进行了 SDK 初始化。成功引入 A/B Testing SDK 之后,请先在神策分析前端页面创建相关的分流试验,然后获取生成的分流 URL。
在普通Java项目初始化SDK
普通Java项目初始化SDK
// 初始化神策分析 SDK
final ISensorsAnalytics sa = new SensorsAnalytics(new ConcurrentLoggingConsumer("file.log"));
// 构建配置 A/B Testing 试验全局参数
ABGlobalConfig abGlobalConfig = ABGlobalConfig.builder()
.setApiUrl("分流试验请求地址")
.setSensorsAnalytics(sa) // 神策分析埋点 SDK 实例
.build();
// 初始化 A/B Testing SDK
final ISensorsABTestLocal abTest = new SensorsABTestLocal(abGlobalConfig);
在Spring框架中初始化SDK
本地分流 Java A/B Testing SDK 与神策分析 SDK 初始化方式相同,需要在全局初始化一次即可。推荐将初始化操作装配成 Bean,交给 Spring 容器来管理。下面提供两种方式创建 Bean,在实际项目中根据实际情况任选其一进行创建即可。
使用XML配置文件创建Bean对象
首先构建静态工厂,生成 A/B Testing 试验实例对象。
静态工厂
public class ABTestInstanceFactory {
public static ISensorsABTestLocal getABTestConfigInstance(String url, ISensorsAnalytics sa)
throws InvalidArgumentException {
ABGlobalConfig config = ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build();
return new SensorsABTestLocal(config);
}
}
然后在 xml 配置文件中创建 Bean 对象。
xml创建bean对象
使用注解创建Bean对象
使用注解创建Bean对象
@Configuration
public class SensorsConfig {
@Bean(name = "sa", destroyMethod = "shutdown")
public ISensorsAnalytics initSensorsAnalytics() throws IOException {
//本地日志模式(此模式会在指定路径生成相应的日志文件)
return new SensorsAnalytics(new ConcurrentLoggingConsumer("file.log"));
//debug 模式(此模式只适用于测试集成 SDK 功能,千万不要使用到生产环境!!!)
//return new SensorsAnalytics(new DebugConsumer("数据接收地址", true));
//网络批量发送模式(此模式在容器关闭的时候,如果存在数据还没有发送完毕,就会丢失未发送的数据!!!)
//return new SensorsAnalytics(new BatchConsumer("数据接收地址"));
}
@Bean
public ISensorsABTestLocal initSensorsABTest(ISensorsAnalytics sa) throws InvalidArgumentException {
String url = "分流试验地址";
ABGlobalConfig config = ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build();
return new SensorsABTestLocal(config);
}
}
在业务代码中调用Bean对象
在业务代码中调用Bean对象
@Service
public class TestServiceImpl implements ITestService {
//注入神策实例化对象
@Autowired
ISensorsAnalytics sa;
//注入 A/B Testing 实例化对象
@Autowired
ISensorsABTestLocal abTest;
public String abTest(String userId) throws InvalidArgumentException, IOException {
Experiment experiment = abTest.fastFetchABTest(userId, true, "color", "grey");
String result = experiment.getResult();
switch (result) {
case "试验值一":
//命中试验一 do something
break;
case "试验值二":
//命中试验二 do something
break;
case "grey":
//没有命中任何试验,返回设置默认值
break;
}
return "success";
}
}
获取分流试验变量信息
使用fastFetchABTest接口,获取试验变量信息。SDK内部会根据请求的试验参数对应的试验类型、分流主体和用户筛选条件,自动判断分流方式。
请确保对A/B分流返回的 result 结果 & 接口中使用的默认值,都做了正常的业务逻辑处理!
如果您对调用接口的延迟有比较高的要求,需要确保在SDK本地计算分流结果,建议您接入前确认您请求的试验参数对应的试验是否完全满足支持本地分流的试验配置条件!
如果您需要在新用户注册流程中使用A/B Testing服务端SDK对新用户进行用户主体分流试验,则不建议您在调用接口时传入loginId请求分流。可参考以下方案,根据您试验的实际情况选择其一即可:
- 试验使用登录ID主体而不是用户主体。
- 如果用户只会在一台设备登录,没有多设备登录场景,可使用客户端设备的匿名ID请求分流,即distinctId为从客户端获取的匿名ID,isLoginId为false.
- 可以将试验移到客户端进行。
获取分流试验变量信息
String distinctId = "fz123456"; // 具体的用户 ID 标识
boolean isLoginId = true; // 当前用户是否是登录 ID
// Integer 类型试验(第四个参数 0,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
Experiment experiment = abTest.fastFetchABTest(distinctId, isLoginId, "具体的试验参数", 0);
int result = experiment.getResult();
// TODO 根据 result 处理相应逻辑
switch (result) {
case 0:
break;
case 1:
// 试验组 1 的处理逻辑
break;
case 2:
// 试验组 2 的处理逻辑
break;
// ……
// ……
default:
// 其他情况的处理逻辑
break;
}
携带自定义属性获取试验变量
本地分流 Java A/B Testing SDK 支持自定义属性扩充受众筛选能力,可以在初始化 SDK 后,通过 API 添加自定义属性获取具体试验的变量值。
自定义属性值支持字符串、字符串数组、数值、布尔和日期时间格式,并且属性名支持英文、数字、下划线,且不能以数字开头。
可在相应的业务逻辑中添加如下代码:
携带自定义属性获取试验变量
// 当前为 Integer 类型试验(第二个参数 0,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
String distinctId = "fz123456"; // 具体的用户 ID 标识
boolean isLoginId = true; // 当前用户是否是登录 ID
Map properties = Maps.newHashMap();
properties.put("自定义属性对应英文名", "自定义属性对应 value"); // 自定义属性
// 当前为 Integer 类型试验(第四个参数 0,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
Experiment experiment = abTest.fastFetchABTest(distinctId, isLoginId, "具体的试验参数", 0, properties);
// TODO 请根据 experiment.getResult() 进行自己的试验
switch (result) {
case 0:
break;
case 1:
// 试验组 1 的处理逻辑
break;
case 2:
// 试验组 2 的处理逻辑
break;
// ……
// ……
default:
// 其他情况的处理逻辑
break;
}
携带自定义主体获取试验变量
本地分流 Java A/B Testing SDK支持使用自定义主体进行分流。在接入前,需要确认以下几点:
- 确认您要使用的自定义主体参数名(例如 phone_number, account等,支持自定义)。
- 在神策元数据管理将该自定义主体设置为公共属性。
- 将自定义主体名提供给神策,由神策技术人员将其配置到分流服务后台。
初始化SDK后,在调用获取试验变量API时,手动将自定义主体添加到接口请求参数customId中,并在后续上报的事件中添加该自定义主体作为事件属性。
自定义主体分流
String distinctId = "fz123456"; // 具体的用户 ID 标识
boolean isLoginId = true; // 当前用户是否是登录 ID
// Integer 类型试验(第四个参数 0,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
Experiment experiment = abTest.fastFetchABTest(
SensorsABParams.starter(distinctId, isLoginId, "具体的试验参数", 0).addCustomId("自定义主体参数名", "自定义主体参数值").build());
int result = experiment.getResult();
// TODO 根据 result 处理相应逻辑
switch (result) {
case 0:
break;
case 1:
// 试验组 1 的处理逻辑
break;
case 2:
// 试验组 2 的处理逻辑
break;
// ……
// ……
default:
// 其他情况的处理逻辑
break;
}
//如果需要上报事件参与AB试验指标计算,需要将该自定义主体作为事件属性
sa.track(EventRecord.builder().setDistinctId(distinctId).isLoginId(isLoginId)
.setEventName("buy")
.addProperty("自定义主体参数名", "自定义主体参数值")
.addProperty("price", 100)
.build());
获取设备主体试验变量
本地分流 Java A/B Testing SDK支持使用设备主体进行分流,需要参考以下代码做对应的接入设置。
接入前请参考如何设置distinctId,在调用时正确设置distinctId参数。获取设备主体试验变量时,distinctId为从客户端获取的匿名ID。
请确保对A/B分流返回的 result 结果 & 接口中使用的默认值,都做了正常的业务逻辑处理!
获取设备主体试验变量
String distinctId = "anonymous_id"; // 匿名ID
boolean isLoginId = false; // 当前distinctId不是登录ID
// Integer 类型试验(第四个参数 0,表示未命中试验时,会返回此默认值,请根据业务需要更改此处的值)
Experiment experiment = abTest.fastFetchABTest(distinctId, isLoginId, "具体的试验参数", 0);
int result = experiment.getResult();
// TODO 根据 result 处理相应逻辑
switch (result) {
case 0:
break;
case 1:
// 试验组 1 的处理逻辑
break;
case 2:
// 试验组 2 的处理逻辑
break;
// ……
// ……
default:
// 其他情况的处理逻辑
break;
}
//如果需要上报事件参与AB设备主体试验指标计算,需要在每条埋点事件中将anonymous_id作为事件属性上报,如下所示
sa.track(EventRecord.builder().setDistinctId(distinctId).isLoginId(isLoginId)
.setEventName("buy")
.addProperty("anonymous_id", distinctId) //将anonymous_id作为事件属性上报
.addProperty("price", 100)
.build());
API介绍
初始化全局参数设置说明
Java A/B Testing SDK 的全局参数封装在 ABGlobalConfig 类中,具体参数如下:
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
sensorsAnalytics | ISensorsAnalytics | 是 | 神策分析 SDK 实例对象(此处使用神策分析 SDK 版本为 3.2.0 及以上版本) |
apiUrl | String | 是 | 分流试验地址 |
eventCacheTime | Integer | 否 | 单用户事件缓存时间,默认值为 1440min,最大限制 1440min,最小限制 0min,仅在线分流生效 |
eventCacheSize | Integer | 否 | 事件总缓存用户量,默认值为 4096,无上限设置,最小限制 0,仅在线分流生效 |
experimentCacheSize | Integer | 否 | 试验总缓存用户量,默认值 4096,无上限设置,最小限制 0,仅在线分流生效 |
experimentCacheTime | Integer | 否 | 单用户试验缓存时间,默认值为 1440min,最大限制 1440min,最小限制 0min,仅在线分流生效 |
enableEventCache | Boolean | 否 | 上报事件缓存开关,默认为true |
interval | Integer | 否 | 获取本地分流试验配置的时间间隔,默认60s |
experimentConfigQueryTimeoutMilliseconds | Integer | 否 | 获取本地分流试验配置的超时时间,默认3000ms |
API方法说明
描述 | 说明 |
---|---|
方法名 | fastFetchABTest |
参数 |
|
返回值 | Experiment |
方法返回值说明
Java A/B Testing SDK 统一返回 Experiment
参数名 | 类型 | 说明 |
---|---|---|
distinctId | String | 具体的用户 ID 标识 |
isLoginId | boolean | 当前用户是否是登录 ID |
abTestExperimentId | String | 试验 ID |
abTestExperimentGroupId | String | 试验分组 ID |
isWhiteList | boolean | 是否白名单用户,白名单用户不进行试验事件的上报 |
isControlGroup | boolean | 是否是对照组 |
result | T 泛型 | 试验命中返回值,目前支持类型 (number|boolean|String|json) |
手动触发 A/B 测试($ABTestTrigger)事件说明
手动触发AB事件说明
Java A/B Testing SDK 中提供的方法中,如果设置参数 enableAutoTrackEvent=true 或者不设置,并且事件内存缓存中不存在,SDK 会自动上报 A/B 测试($ABTestTrigger)事件,作为默认的用户进组标记事件。
如果设置 enableAutoTrackEvent=false ,则需要用户自己手动触发上报 A/B 测试($ABTestTrigger)事件
SDK 提供 trackABTestTrigger 方法,示例如下:
手动触发AB事件
// 手动触发 A/B 测试($ABTestTrigger)事件
abTest.trackABTestTrigger(experiment)
trackABTestTrigger 方法使用说明:
方法名 | trackABTestTrigger |
---|---|
参数 | Experiment Map |
返回结果 | 无 |
调试试验
- 可以通过录入调试设备的方式,把用户加入指定分组中;加入调试设备后,会强制命中当前试验指定的分组(调试设备在调试状态和正式上线阶段都会生效)。
- 使用服务端SDK对该用户请求分流,返回当前试验指定的分组。需要注意的是,在请求分流时,请根据调试设备的ID类型(设备ID、登录ID)正确设置分流API中使用的distinctId与isLoginId参数,否则可能不会命中试验。