跳到主要内容

设计 A/B 测试平台

需求

设计公司级 A/B 测试平台,支持:

  • 同时运行 50+ 实验,互不干扰
  • 分钟级指标更新
  • 自动显著性检验和报告生成

架构设计

核心模块

模块功能技术方案
实验管理创建/配置/上下线实验Web 管理后台 + 配置中心
分流引擎用户分桶、流量分配hash(user_id + experiment_id) % 100
数据采集行为埋点、事件收集Kafka + 埋点 SDK
指标计算实时/离线指标聚合Flink(实时) + Spark(离线)
统计检验p 值、置信区间、MDEPython 统计库
报告引擎自动生成实验报告模板引擎 + BI

分流算法

import hashlib

def assign_bucket(user_id: str, experiment_id: str, total_buckets: int = 100) -> int:
"""确定性分流:同一用户在同一实验中始终进入同一桶"""
key = f"{user_id}_{experiment_id}"
hash_value = int(hashlib.md5(key.encode()).hexdigest(), 16)
return hash_value % total_buckets

def get_variant(user_id: str, experiment_config: dict) -> str:
"""根据流量分配返回实验组"""
bucket = assign_bucket(user_id, experiment_config['id'])
cumulative = 0
for variant, traffic_pct in experiment_config['variants'].items():
cumulative += traffic_pct
if bucket < cumulative:
return variant
return 'control'

多层实验

不同层的实验使用不同的 hash seed,实现正交分流,互不影响。

常见面试问题

Q1: 如何保证实验结果可信?

答案

  1. SRM 检测(Sample Ratio Mismatch):检验各组样本量比例是否符合预期
  2. AA 测试:上线前先跑 AA 实验,验证指标无显著差异
  3. 多重比较矫正:多指标/多变体时用 Bonferroni 校正
  4. 最小实验周期:至少覆盖一个完整业务周期(通常 7-14 天)
  5. 新奇效应排除:前 1-2 天的数据可能不稳定,需排除

Q2: 实验指标如何设计?

答案

指标类型说明示例
核心指标实验想要提升的目标指标转化率
护栏指标不能恶化的底线指标页面加载时间、用户留存
诊断指标帮助理解原因的辅助指标页面浏览量、按钮点击率

相关链接