百度搜索结果波动的极致治理

作者 | ZZ
导读
本文讲述百度搜索系统面临搜索结果一致性的挑战,如何准确衡量并消除不一致因素成为关键问题。本文介绍了百度搜索系统针对结果波动问题的创新解决方案,通过设计数据打平技术,将问题量化至服务与特征层面,并利用 fake 流量与动态 debug 机制进行大量实验与数据收集。同时,采用多实验统筹与自动巡检机制提高实验效率与分析自动化,最终成功捕获所有对结果波动有实质贡献的特征,为系统优化提供了精确指导,显著降低了结果波动。
01 结果一致性刻画
百度搜索系统是一个复杂的异地多活分布式系统,旨在高效满足用户的搜索请求(query)的同时,确保结果的一致性,并极力消除不稳定因素对搜索结果一致性的负面影响,以保障用户体验。
影响搜索结果一致性的因素有很多,包括用户的因素、时间的因素、系统的缺陷或故障,等等。这些因素中,有些是合理的,比如:系统更新过程中,同一用户在不同时间得到不同的结果。也存在不合理的因素,比如:服务实例的偶发故障。在刻画搜索结果一致性时,我们的目标是排除合理因素的干扰,仅反映不合理因素带来的不一致性。为此,我们设计了一种方法,排除用户因素和时间因素这两个最大的合理因素,使指标主要反映不合理因素。
1.1 量化
我们实时地从所有进入搜索系统的 query 中,按很小的概率随机抽取一小部分 query 集合,称为“用户 diff 率小流量”。对于小流量中的每个 query,我们用一种方法产生两个完全相同的 queryA 和 queryB,即“query 对”,使它们同时进入系统处理,分别得到结果 resultA 和 resultB。resultA 和 resultB 的 url 序列会在顶层服务进行比对。如果两份序列不一致,那么我们就称为该 query 是个“有 diff 的 query”。
在一段时间内,用户 diff 率小流量包含的 query 总数为 N,其中有 diff 的 query 数量为 M,那么定义这段时间内的“diff 率”为 M / N。
通过这种方式,我们可以生成 diff 率的监控曲线图,称为 diff 率曲线。如下图所示。

1.2 问题表现
理想情况下,如果系统可靠稳定,diff 率应该非常接近于 0。而实际情况是,diff 率曲线表现为一个显著大于 0 的值,有时,会突然暴涨并在随后的某个时刻突然下跌,或者长时间保持在一个比较大的值,根因难以定位。主要归因于搜索系统的庞大规模、query 处理流程的复杂性以及中间数据形态的多样性。
1.3 通常做法
常规方法应对 diff 率问题虽然直观,但是不足之处也有很多。基于线下测试,虽然简单易行,但是因环境差异,结论难以直接应用于生产环境。全量 tracing 和 logging 机制虽然强大,但是在生产环境中因性能和存储限制,难以获取足够的调试级别数据(debug 数据)来分析 diff 率根因。基于关键位置特征 dump 的方案,通过统计特征自身不一致率来识别潜在问题,但它属于相关性分析,难以确立因果关系,并且因抽样分析导致可能遗漏真正原因。
02 我们的方案
从以上的各种困境可以看出,没有一个小而美的方法能直接找到根因。为了应对这些挑战,我们提出并实施了一套创新的解决方案。要点如下。
1.通过在生产环境进行特征打平实验,来证明特征对大盘 diff 率的贡献度,从而避免任何“推断”导致的结论偏差。
2.通过多种手段极致优化单次实验的执行效率和根因分析能力。
3.自顶向下白盒化搜索系统,使大盘 diff 率完备地拆解到各个局部系统的各特征,并基于流量的空间复用机制并行化全部打平实验。
4.建设自动巡检机制产出系统各局部的各特征对大盘 diff 率的贡献度,形成人工 0 参与的自动化飞轮机制,使 diff 率贡献者完全暴露,对优化工作带来直接的指导。
如下图所示。

2.1 底层机制
若系统在处理 query 对(queryA, queryB)时,某局部子系统返回的结果(resultA, resultB)完全相同,则该局部对大盘 diff 率贡献度就为 0。通过主动调整此局部子系统,使其对相同 query 对的结果一致(即“打平”),可将该局部对大盘 diff 率的贡献归零。
为了量化某局部对大盘 diff 率的贡献,设原始大盘 diff 率为 D。在生产环境中,通过一定方法对该局部在用户 diff 率小流量中的 query 对结果进行打平,观察大盘 diff 率变化至 Dx(保持不变或降低),则该局部对大盘 diff 率的贡献显然为 D - Dx。此外,还可以对结果中特定特征进行打平,进一步评估该特征对大盘 diff 率的贡献。原理如下图。

工程实现要点:
1.流量染色:在 query 中添加染色标记,用于指示在特定处理阶段后,需要与打平 server 进行交互,这包括数据的发布与打平结果的接收。
2.动态角色分配:打平 server 根据数据到达的先后顺序,动态确定发布者和订阅者角色,先到达的数据视为发布者,后到达的视为订阅者。
3.数据打平处理:发布者的数据包与订阅者的数据包均被发送至打平 server 进行保存和决策。对于发布者,直接返回其数据包;对于订阅者,根据预定义配置对其数据进行打平操作,这包括整体复制发布者的数据包或修改订阅者数据包中的特定特征,以生成打平后的数据包并返回给订阅者。
2.2 单次打平实验
2.2.1 实验效率
针对系统中服务间交互的数据包格式,设计统一的特征位置描述规则,简化打平实验的配置流程。同时,针对不同的打平场景(例如,在数据形态 X 的情况下打平 Y 特征),抽象出不同类型的打平策略以便直接使用。如下图所示。

2.2.2 爆炸半径 VS. 实验结论可靠性
为了完全不影响用户体验,打平实验虽然在很小比例的流量下进行,我们也尝试使用 fake 流量,使爆炸半径完全降到零且不失实验准确性。
用户 diff 率小流量反映真实 diff 率,而 fake 流量虽能降低爆炸半径至零,但与真实流量存在差异,可能导致 diff 率不一致。为确保实验可靠性,需在 fake 流量与真实流量反映的 diff 率一致的前提下进行实验。
为此,采取“解耦”做法:维持原用户 diff 率小流量不变,仅用于产出真实 diff 率;设立 diff 率 fake 基准小流量和 diff 率 fake 实验小流量,前者仅用于产出 fake 基准 diff 率,后者既用于产出 diff 率又用于打平实验。在不进行实验时,fake 实验 diff 率与 fake 基准 diff 率天然一致,因此可将 fake 基准 diff 率视为 fake 小流量不进行实验时的 diff 率。
使用方法为:在真实 diff 率与 fake 基准 diff 率一致的前提下,利用 diff 率 fake 实验小流量进行打平实验,此时实验结论才有效。通过 diff 率 fake 基准小流量这个“桥梁”,实现了打平实验的零爆炸半径与结论可靠性的兼得。如下图。

2.2.3 动态 debug
借助 fake 流量,我们能够自由地执行所需操作,确保不会对用户体验产生负面影响。利用 fake 流量,我们不仅限于进行打平实验,还进一步产出调试级别的详尽现场数据(即 debug 数据)。这使我们不仅能够评估各特征的贡献度,还能依托 debug 数据深入剖析并定位问题的根因。顺便说明,debug 数据的收集采用类似 dapper 原理。如下图。

2.3 多实验统筹
2.3.1 大盘 diff 率完备拆解
尽管单次打平实验成本已显著降低,但全面评估搜索系统中各局部及特征对大盘 diff 率的贡献仍需大量实验,成本较高。为在有限时间内高效完成实验,我们采用自顶向下的策略,逐步深入拆解。
首先,对 query 处理过程进行白盒化分析,将系统分层拆解,并逐层进行打平实验,以聚焦主要矛盾。具体步骤包括:
1.对首层全部局部进行整包打平,识别贡献度最大的局部;
2.对贡献度最大的局部进一步拆分至第二层,重复整包打平,寻找贡献度最大的二级局部;
3.依次类推,逐层深入,直至各局部贡献度降至指定阈值以下。
然后,针对找到的局部,我们进一步识别显著贡献度的特征。
示意图如下

2.3.2 流量空间复用
从系统容量安全考虑,当实验数量增多时,我们不以 scale out 的方式增加实验流量,而是使总实验流量比例保持不变的情况下,以 scale in 的方式向内拆解流量,形成诸多流量桶。每个桶建立独立 diff 率指标曲线,并可独立进行打平实验。结合 service mesh 实现流量流量选桶及实验类型配置。流量总桶数 N 静态配置,流量属于哪个桶通过 queryID 对 N 取模确定。打标记的流量在搜索系统对应位置进行发布、订阅动作,并传达到打平 server 实现特征打平。如图所示。

2.4 自动巡检飞轮
在打平实验决策及配置确定后,从实验执行到 diff 率监控反馈的自动化流程已实现。为进一步提升自动化水平,我们引入了“自动巡检”机制,旨在实现打平实验的闭环自动决策与结论产出。如下图

该机制包括打平实验自动决策(图左)与 diff 率贡献度报表自动生成(图右)两部分。自动决策部分通过 dump request 和 response 包到打平 server,执行打平动作并存储数据包。随后,特征自身一致性计算和筛选 server 定期从存储系统中获取数据包,计算各特征自身不一致率,筛选出候选特征并生成打平实验配置,推送到 mesh 控制面以执行实验。报表自动生成部分则通过新建报表生成 server,定期从监控系统中提取各桶 diff 率数据,计算对应特征贡献度,并生成贡献度报表。
此套系统显著提高了分析效率与准确性,实现了全程自动化与智能化,达到了人工零参与。
03 效果
本文提出的创新方案取得了显著成效,成功捕获了所有对大盘 diff 率有实质贡献的特征,并深入分析了其根本原因,为系统优化提供了精确指导。通过这套方案,大盘 diff 率得到了有效治理,系统中微小差异得到了显现,同时揭示出了常规分析中难以发现的、对结果波动有微妙影响的因素。此外,该自动化机制提供持续监控和即时反馈,确保异常特征能被及时发现并处理。
04 总结
本文阐述了百度搜索系统针对 diff 率问题的创新解决方案,通过设计数据打平技术,将问题量化至服务与特征层面,实现精确贡献度的衡量。构建打平 server 支持数据订阅与发布,实现低代码实验配置,并利用 fake 流量与动态 debug 机制,在不影响用户体验的情况下进行大量实验与数据收集。采用多实验统筹与自动巡检机制,提高实验效率与分析自动化。最终,捕获所有对 diff 率有实质贡献的特征,分析根本原因,指导系统优化,显著降低结果的波动,节省人力与时间成本。
值得注意的是,结果波动是分布式系统中普遍存在的问题。本文以百度搜索系统为例,不仅展示了我们在提升用户搜索体验方面的不懈努力与创新成果,更期望能为广大分布式系统领域的从业者提供有益的启示与实用的减负效果,共同推动技术的进步与发展。
————END————
推荐阅读
PaddleX图像分割赋能医疗领域筛查检测,打造智能医疗诊断系统
评论