fix: 注册积分 A/B 仅作用于非首次调用,避免双发污染
背景
注册积分 A/B 实验:验证"新用户注册即发 100 积分" 是否带来下游转化提升。对照组=偶数 uid 发 100,实验组=奇数 uid 发 0。
核心改动
1. 注册积分分流(AgentUserPointsServiceImpl.initUserPoints)
上游会连调两次——注册本身 + 绑邀请码。首次调用按原值落账,不走 A/B;二次及以后且 initPoints==0 才按 uid 奇偶分桶。 initPoints>0(正常邀请码 / admin 充值)全场景原值透传。
首次判断抓手:AgentUserPointsInnerService.existsByUserId(userId) 查 agent_user_points 汇总表是否已有记录。
2. 停用免费用户月度初始化积分补贴
AnnuallyPlanPointsResetTaskJob.FREE_USER_MONTHLY_INITIALIZE_POINTS 100 → 0;grantMonthlyInitializePointsToNoSubscriptionUsers() 入口加 early-return 短路整段发放,避免下游 grantPoints<=0 → failed 触发批量告警日志。
行为矩阵
| 调用顺序 | initPoints | uid | 已存在记录 | 最终落账 |
|---|---|---|---|---|
| Call 1(注册) | 0 | 任何 | 无 | 0(原值,首次不走 A/B) |
| Call 2(绑 0 分码) | 0 | 偶 | 有 | 100(对照组) |
| Call 2(绑 0 分码) | 0 | 奇 | 有 | 0(实验组) |
| Call 2(绑正常码 N) | N>0 | 任何 | 有 | N(原值透传) |
| 月度 reset job | — | — | — | 全员跳过(早退) |
测试覆盖
AgentUserPointsServiceImplAbTest:8 个纯 Mockito 用例,首次/二次 × 偶/奇/正值全覆盖。Tests run: 8, Failures: 0, Errors: 0
回滚
- A/B 下线:把
REGISTER_AB_CONTROL_POINTS/REGISTER_AB_TREATMENT_POINTS都置 0,或直接 revert 本 MR - 恢复月度补贴:
FREE_USER_MONTHLY_INITIALIZE_POINTS改回 100,早退分支自动失效
风险点
-
依赖"首次调用 existsByUserId=false":若未来上游在 provider 之外先创建
agent_user_points行,会导致第一次 init 被判成"已初始化"。当前仓库内无此类路径。 - 奇数 uid 实验组落账 0:对下游扣积分 / 展示层来说是合法状态,需产品/运营知晓文案。
- 0 分邀请码:命中二次调用 A/B 路径——此即本次实验的核心诉求。
Commits
-
be54542feat: 注册积分 A/B 分流 + 停用免费用户月度补贴 -
cb7b248fix: 注册积分 A/B 仅作用于非首次调用,避免双发污染