3. 分层试验架构设计:分层模型、策略与隔离性
分层试验架构是支撑大规模并行试验的基石。它通过将试验流量按不同维度(用户、会话、事件)进行分层,并配合科学的流量分配与隔离机制,确保多个试验在同一时间段内互不干扰、结果可信。本章将深入剖析分层模型、分层策略与流量分配,以及分层试验的隔离性原理。
3.1 分层模型:用户层、会话层、事件层
分层模型的核心思想是将试验流量按照其影响范围与生命周期进行垂直切分。常见的分层模型包含三个核心层级:用户层、会话层与事件层。每个层级对应不同的试验对象与随机化单元。
| 层级 | 随机化单元 | 生命周期 | 典型试验场景 |
|---|---|---|---|
| 用户层 | 用户 ID(User ID) | 长期(用户生命周期) | 首页改版、推荐算法、会员权益、UI 主题 |
| 会话层 | 会话 ID(Session ID) | 短期(单次访问) | 搜索排序、页面布局、弹窗策略、导航结构 |
| 事件层 | 事件 ID(Event ID) | 瞬时(单次交互) | 按钮文案、颜色、点击反馈、加载动画 |
实践要点:用户层试验的随机化单元是用户 ID,一旦用户被分配到一个变体,该用户在所有后续访问中都将看到该变体。会话层试验每次用户打开 App 或网站时重新随机化。事件层试验则针对每一次用户交互(如点击、滑动)进行随机化。
下图展示了三层模型在流量分配与试验嵌套中的关系:
3.2 分层策略与流量分配
分层策略决定了如何将总流量切分到不同层级,以及每个层级内如何为多个试验分配流量。常见的分层策略包括:
- 完全正交分层:每个层级独立使用全部流量,层级之间通过哈希函数保证正交性。优点是流量利用率高,缺点是哈希计算复杂。
- 独占分层:每个层级分配固定比例的流量,层级之间流量不重叠。优点是隔离性好,缺点是流量利用率低。
- 混合分层:结合正交与独占,核心层级使用正交,非核心层级使用独占。
流量分配的核心原则是:同一层级内的多个试验必须共享该层级的流量,且每个试验只能使用该层级流量的一部分。流量分配通常采用 哈希分桶 技术。
哈希分桶公式:
// 伪代码示例:将用户 ID 分配到 1000 个桶中
bucket = hash(user_id + salt) % 1000
// 如果试验 A 使用桶 0-99,则试验 A 获得 10% 的流量
if 0 <= bucket < 100:
assign_to_experiment_A()
// 如果试验 B 使用桶 100-199,则试验 B 获得 10% 的流量
elif 100 <= bucket < 200:
assign_to_experiment_B()
下图展示了流量在用户层内部分配给多个试验的过程:
3.3 分层试验的隔离性原理
隔离性是分层试验架构的核心要求。它确保不同层级、不同试验之间的效果不会相互污染。隔离性原理主要基于以下三个机制:
- 随机化单元隔离:不同层级使用不同的随机化单元(User ID、Session ID、Event ID),从根源上避免同一实体被重复分配。
- 哈希正交性:通过为每个层级和每个试验使用独立的哈希盐值(salt),确保同一用户在不同层级被分配到不同试验时,其分配结果相互独立。
- 流量域隔离:每个试验只能在其所属层级的流量域内生效,不能跨域影响其他层级的试验。
常见隔离性破坏场景:
- 哈希冲突:不同试验使用了相同的盐值或哈希算法,导致同一用户在不同试验中被分配到相关变体。
- 流量重叠:两个试验错误地使用了相同的桶范围,导致同一用户同时进入两个试验。
- 跨层干扰:用户层试验改变了用户行为,进而影响会话层或事件层试验的指标,但分析时未做分层校正。
下表总结了不同隔离机制的作用与实现方式:
| 隔离机制 | 作用 | 实现方式 |
|---|---|---|
| 随机化单元隔离 | 避免同一实体被重复分配 | 用户层用 User ID,会话层用 Session ID,事件层用 Event ID |
| 哈希正交性 | 确保分配结果相互独立 | 每个层级/试验使用独立盐值(salt) |
| 流量域隔离 | 防止跨域影响 | 每个试验只在其所属层级的流量域内生效 |
验证隔离性的最佳实践:在正式试验上线前,进行 空跑验证(A/A Test)。将同一层级的流量随机分成两组,不施加任何干预,观察两组之间的指标差异是否在统计波动范围内。如果差异显著,说明可能存在隔离性问题,需要检查哈希算法或流量分配逻辑。