在分布式系统中,尾部延迟(P99)往往是用户体验的关键瓶颈。对于每请求必达的授权系统而言,这个问题尤为突出 —— 每一次用户访问资源,都需要先完成一次授权检查,这个环节的性能直接叠加到整体响应时间中。OpenFGA 作为 Google Zanzibar 架构的开源实现,其核心的 Check API 需要在关系图中进行可达性遍历,而图遍历天然存在性能分布的长尾特性。
传统方案通常根据图的静态特征(如节点复杂度、边密度)预先选择遍历算法。然而生产环境的数据分布远比基准测试复杂,同一套策略在不同租户、不同时间段的性能表现可能截然不同。OpenFGA 团队面临的挑战是:如何让策略选择器具备实时学习能力,在每一次 Check 请求中自适应地选择最优遍历路径。
从路由问题到多臂老虎机
最初的设计思路倾向于基于规则路由 —— 为不同类型的子图配置不同的候选策略池,再根据某种计数器机制选择执行路径。但这种方案存在明显的工程脆弱性:阈值参数需要反复人工调优,一旦数据分布发生漂移,系统无法自动适应。
将问题重新建模后,团队意识到这正是经典的多臂老虎机(Multi-Armed Bandit)场景。每一台老虎机对应一种遍历策略,玩家的目标是在有限次拉动中最大化累积收益。映射到 OpenFGA 的语境,收益函数就是延迟的负向度量 —— 延迟越低,收益越高。关键在于,多臂老虎机天然需要平衡两个相互冲突的目标:利用已知最优策略确保稳定性(Exploitation),以及尝试其他策略以发现潜在更优解(Exploration)。
在几种标准算法中,团队评估了 Epsilon-Greedy、Upper Confidence Bound(UCB)和 Thompson Sampling。Epsilon-Greedy 实现简单,但需要手动设定探索比例;UCB 虽然有理论遗憾界保证,但在实际系统中对噪声数据不够鲁棒。Thompson Sampling 的优势在于它维护的是完整的概率分布而非单一点估计,能够自然地根据观测数据调整探索强度 —— 当某个策略的分布变得 narrow 且位置较低时,系统会自动降低选择概率;当分布呈现 high uncertainty 时,系统反而会增加探索概率。
正态 - 伽马共轭先验的工程权衡
Bayesian 方法的效果高度依赖于先验分布的选择。OpenFGA 团队选择 Normal-Gamma 分布作为共轭先验,这一选择有明确的工程考量:它允许同时建模延迟的期望值(均值)和可靠性(方差),而共轭性质保证了后验更新可以在 O (1) 时间复杂度内完成,无需昂贵的数值积分。
具体而言,每个策略维护四个参数:mu(初始均值估计)、lambda(对均值的置信度权重)、alpha(Gamma 分布的 shape 参数)和 beta(Gamma 分布的 rate 参数)。更新过程遵循贝叶斯规则:新观测值会同时调整这四个参数,生成新的后验分布。
在实际配置中,团队针对不同策略采用了差异化的先验初始化策略。对于已验证的高性能策略,配置较高的 lambda 值和较高的 alpha 配合较低的 beta。这种组合产生的是一个 narrow belief—— 系统对这个策略的性能有强置信度,会持续利用它直到出现明显性能退化。相反,对于通用策略,配置较低的 lambda(接近 1)和较低的 alpha/beta,系统在冷启动阶段会表现出强烈的探索倾向,快速学习该策略在实际数据分布下的真实性能。
这种参数化设计的精妙之处在于,当高性能策略遭遇数据漂移导致延迟上升时,初始的 narrow belief 会因为观测值与预期的巨大偏差而产生方差爆炸,系统随即从 exploitation 模式切换到 exploration 模式,开始尝试其他候选策略。整个过程无需人工介入,完全由概率分布的数学性质驱动。
在线学习与生产环境验证
部署到 Auth0 FGA(基于 OpenFGA 的托管授权服务)后,效果立竿见影。对于模型复杂度最高的租户,P99 延迟从基准水平骤降至 50 毫秒以下,实现了 98% 的性能跃升。更有趣的发现来自多租户环境的多样性:某些特定数据分布下,原本被计划替换的 legacy 策略反而表现最优。系统通过在线学习正确识别出了这一 corner case,这超出了任何静态基准测试的覆盖范围。
从工程角度看,整个方案的设计从一开始就考虑了性能开销。Thompson Sampling 的采样逻辑和参数更新都经过精心优化,能够嵌入到 Check 请求的关键路径中而不会成为新的瓶颈。同时,策略定义的解耦设计使得新增遍历算法只需实现标准接口并配置相应先验参数,即可被规划器自动纳入候选池。
资料来源:Auth0 Engineering Blog,OpenFGA GitHub(thompson.go 实现)。