Skip to content

SDK 初始化

每个 ABetterChoice SDK 启动时形态一致:识别项目、证明调用方身份、按需调整轮询与曝光行为,然后 让 SDK 实例与进程或会话同生命周期。

必填字段

字段来源作用
project_id控制台 URL 中 /app/ 后的路径段。决定加载哪些实验与配置。
secret_keySettings → SDK&Key。Quickstart 用默认 key 即可。为 SDK 的每次请求做认证。
unit_id应用侧稳定的用户 / 会话 / 设备 ID。决定该次调用落在哪个分组。同一 unit_id 始终同分组。

project_idsecret_key 通过构造或 Init 调用传入;unit_id用户上下文 (服务端 SDK)或SDK 实例(客户端 SDK)上设置。

服务端 SDK 生命周期

服务端 SDK 跑在长生命周期进程内。今天 Go 服务端 SDK 已正式可用,C++ 服务端 SDK 仍是 Coming soon。两者推荐结构相同:

  1. 启动时初始化一次 —— 服务对外提供流量前调用 abc.Init(...)(Go)。SDK 上线后,C++ 的 入口形态是 AbcService::GetInstance()->Init(...)
  2. 每 3 秒后台轮询 —— 配置在后台被刷新;getExperiment / getFeatureFlag 总是读本地缓存, 热路径保持亚毫秒级。
  3. 每次请求构建用户上下文 —— abc.NewUserContext(unit_id)(Go)把 unit_id 包进当次请求; 计划中的 C++ 形态是 WithSetUnitID(unit_id)
  4. 进程退出前 Release —— defer abc.Release()(Go)即可,SDK 会把缓存的曝光刷出。

控制台变更到服务端 SDK 的总传播时延约 15 秒(DB → 全局配置服务 → SDK 轮询)。

客户端 SDK 生命周期

客户端 SDK 与一次 App 或页面会话同生命周期。今天三种客户端 SDK(Android、iOS、JavaScript) 在 Settings → SDK&Key 下都是 Coming soon —— 下面的生命周期描述的是它们上线后的行为。 在那之前,移动端与 Web 客户端请通过你服务端上的轻量代理调用 HTTP API

  1. App 启动时初始化一次 —— 提供 projectIdunitIdsecretKey,SDK 从评估服务拉取该 unit_id 的预计算分组。
  2. 读取走本地 —— 后续 getExperiment / getFeatureFlag 立即返回缓存值。
  3. 轮询 —— 当 enableAutomaticPoll(或各平台等价开关)打开时,每 10 分钟刷新一次缓存。
  4. 切账号 —— 用户切换登录账号时调用 switchUnitId,SDK 会为新 unit_id 拉取新的分组集合。
  5. 强制刷新 —— refreshExperiment 立刻重新拉取,开销较大,按需使用。

控制台变更到客户端 SDK 的默认传播时延约 10 分钟。

常用选项

每个 SDK 都暴露这些选项,参数名因语言而异,但语义一致。

选项效果
关闭自动曝光getExperiment 不再在调用时上报曝光,由你后续 LogExperimentExposure。详见 曝光上报
关闭轮询SDK 仅使用初始化时缓存的值,便于离线测试。
自定义后端地址指向私有部署(Go:env.RegisterAddr;C++:WithSetEnv)。
请求超时单次网络调用的等待上限,默认 15 秒。
用户属性 / profiles提供属性值用于受众目标。详见 用户对象

Go 示例

go
err := abc.Init(
    context.Background(),
    []string{"6666"},
    abc.WithSecretKey("YOUR_API_TOKEN"),
    abc.WithDisableReport(true),  // 关闭自动曝光
)
defer abc.Release()

HTTP API 示例

没有 SDK 时,HTTP API 同时承担"初始化"与"获取"——每次请求都是独立的:

bash
ak="your_secret_key_name"
token="your_api_token"
et=$(date +%s)
sig=$(echo -n "${token}${ak}${et}" | md5)

curl -X POST 'https://openapi.abetterchoice.ai/abc/get_experiments' \
  -H "Content-Type: application/json" \
  -H "X-Ak: $ak" -H "X-Et: $et" -H "X-Es: $sig" \
  -d '{"project_id":"6666","unit_id":"user_id_1"}'

JavaScriptAndroidiOSC++ 页面上的形态预览代码沿用 同一份契约;这些 SDK 在 Settings → SDK&Key 下都标记为 Coming soon