SDK 初始化
每个 ABetterChoice SDK 启动时形态一致:识别项目、证明调用方身份、按需调整轮询与曝光行为,然后 让 SDK 实例与进程或会话同生命周期。
必填字段
| 字段 | 来源 | 作用 |
|---|---|---|
project_id | 控制台 URL 中 /app/ 后的路径段。 | 决定加载哪些实验与配置。 |
secret_key | Settings → SDK&Key。Quickstart 用默认 key 即可。 | 为 SDK 的每次请求做认证。 |
unit_id | 应用侧稳定的用户 / 会话 / 设备 ID。 | 决定该次调用落在哪个分组。同一 unit_id 始终同分组。 |
project_id 与 secret_key 通过构造或 Init 调用传入;unit_id 在用户上下文 (服务端 SDK)或SDK 实例(客户端 SDK)上设置。
服务端 SDK 生命周期
服务端 SDK 跑在长生命周期进程内。今天 Go 服务端 SDK 已正式可用,C++ 服务端 SDK 仍是 Coming soon。两者推荐结构相同:
- 启动时初始化一次 —— 服务对外提供流量前调用
abc.Init(...)(Go)。SDK 上线后,C++ 的 入口形态是AbcService::GetInstance()->Init(...)。 - 每 3 秒后台轮询 —— 配置在后台被刷新;
getExperiment/getFeatureFlag总是读本地缓存, 热路径保持亚毫秒级。 - 每次请求构建用户上下文 ——
abc.NewUserContext(unit_id)(Go)把unit_id包进当次请求; 计划中的 C++ 形态是WithSetUnitID(unit_id)。 - 进程退出前 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。
- App 启动时初始化一次 —— 提供
projectId、unitId、secretKey,SDK 从评估服务拉取该unit_id的预计算分组。 - 读取走本地 —— 后续
getExperiment/getFeatureFlag立即返回缓存值。 - 轮询 —— 当
enableAutomaticPoll(或各平台等价开关)打开时,每 10 分钟刷新一次缓存。 - 切账号 —— 用户切换登录账号时调用
switchUnitId,SDK 会为新unit_id拉取新的分组集合。 - 强制刷新 ——
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"}'JavaScript、Android、 iOS、C++ 页面上的形态预览代码沿用 同一份契约;这些 SDK 在 Settings → SDK&Key 下都标记为 Coming soon。