
2026/01/23 5:10
オープンFGAにおけるP99の抑制:自己調整戦略プランナーを構築した方法
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
概要:
OpenFGA のレイテンシークリティカルな「Check」API は、各グラフノードに対してリアルタイムで最適戦略を学習する自己調整型トラバーサルプランナーを採用しています。プランナーはトラバーサル選択を Multi‑Armed Bandit 問題として扱い、各ノードをアームとし、Normal‑Gamma 事前分布付きの Thompson Sampling が次に試すべきトラバーサル計画を選択します。レイテンシーサンプルは原子操作で事前分布を更新し、高度に同時実行的な環境でもスレッドセーフに学習が進みます。
この動的アプローチは、静的ヒューリスティックの代わりに確率的意思決定を導入することで、テールレイテンシーを劇的に削減します。Auth0 FGA モデルなどの複雑なケースでは P99 が 98 % まで低下 しつつ、平均パフォーマンスは変わりません。また、プランナーは特定のサブグラフで最適である場合にレガシーなトラバーサルロジックを「再発見」できるため、多様な顧客ワークロードにも柔軟に対応します。
実際には、ユーザーは一貫して高速化された認可チェックを体感し、企業は速度を犠牲にせずにより豊富なポリシーグラフを展開できます。統計的枠組みは今後の OpenFGA リリースでコア機能となる見込みで、新しいモデルやワークロードに対して自動最適化を提供し、アクセス制御エンジンにおける適応戦略の普及を促進します。
本文
レイテンシークリティカルなシステムの運用
レイテンシークリティカルなシステムでは、テイルレイテンシ(最も遅いリクエストが経験する応答時間)を削減する必要があります。
認可処理はすべてのリクエストで行われるため、決定は高速に実行されなければなりません。さもなくば、総応答時間に余分なオーバーヘッドが生じます。
OpenFGA(Google の Zanzibar をモデル化し、Auth0 FGA に動力を供給するオープンソース認可システム)では、その最も重要な操作である Check が課題です。
「ユーザー X はリソース Y にアクセスできるか?」という質問に答えるには、関係性グラフをトラバーサルする必要があります。この文脈では、トラバーサル性能は単なる機能ではなく、システムアーキテクチャの根本的な制約となります。
問題点
OpenFGA の中心には、関係性タプルから構成されるグラフがあります。
それは 重み付き有向循環グラフ であり、各辺とノードにサブグラフ内の到達可能なユーザータイプごとの重み(複雑度)が割り当てられています。また、再帰性・循環存在・パブリックアクセス可否などのメタデータも保持しています。
これらの情報を利用すれば、適切なトラバーサルアルゴリズムを O(1) で選択できます。
重み付きグラフを使って新しいアルゴリズムを導入した結果、一部のお客様にレイテンシが改善しましたが、全体的には一律ではありませんでした。最適戦略は「静的なグラフ特性」と「各サブグラフ内のタプル分布」の両方に依存するため、トラバーサルプランナー(ヒューリスティックエンジン)が必要になりました。
このプランナーは、両者を基に各サブグラフに最適なアルゴリズムを選択します。
私たちのアプローチ:トンプソンサンプリング
実行中に観測される性能に応じて 動的に トラバーサル選択を変更できる適応型ヒューリスティックを作りたかったため、カウンタや閾値といった手法は脆弱で「マジックナンバー」を常に調整する必要があると感じました。
核心的な洞察は、この問題を古典的な強化学習シナリオ ― Multi‑Armed Bandit (MAB) 問題として捉えることでした。
- 各トラバーサルアルゴリズムはスロットマシンに相当する
- プランナー(エージェント)は各サブグラフリクエストでアルゴリズムを選択し、報酬(ここではレイテンシの最小化)を最大化します
以下の標準的なソルバーを検討しました。
| ソルバー | 特徴 |
|---|---|
| Epsilon‑Greedy | 単純だが ε のチューニングが必要 |
| Upper Confidence Bound (UCB) | 信頼区間で探索と活用のバランスを取る |
| Thompson Sampling | 各戦略ごとに完全な確率分布を保持 |
実際の意思決定システムでは Thompson Sampling が最も頑健であることが判明しました。
平均値だけを追跡する代わりに、各戦略の期待性能に関する 確率分布 を保ちます。
Thompson Sampling の仕組み
- すべての適合する戦略について、その確率分布から乱数サンプルを取得。
- サンプル値が最大になる戦略を選択(貪欲選択)。
- 探索:広く平坦な分布は不確実性が高い → 選ばれる確率が上がる。
- 活用:狭く尖った分布は信頼度が高い → より頻繁に選ばれる。
プランナーは各
Check リクエスト後に事前分布を更新し、タプル分布やレイテンシプロファイルの変化に継続的に適応します。以前最適だった戦略が性能低下すると、その分布は広がったり平均が下がったりして、代替戦略がサンプリングされる確率が上がります。
ドメイン知識のエンコード:事前分布
ベイズシステムはその事前分布に依存します。
リクエストを処理する前に、タプル分布が各アルゴリズムの実行時間に与える影響についてのドメイン知識をエンコードしています。
共役先行:正規ガンマ分布
Normal‑Gamma 分布(形状–レートパラメータ化)を使用します。
これは「平均」(期待レイテンシ) と「精度」(レイテンシの信頼性=逆分散) の二つの不明数を同時にモデル化できるため、更新が O(1) で効率的です。
// Update performs a Bayesian update on the distribution's parameters // using the new data point. func (ts *ThompsonStats) Update(duration time.Duration) { x := float64(duration.Nanoseconds()) for { oldPtr := atomic.LoadPointer(&ts.params) currentParams := (*samplingParams)(oldPtr) newLambda := currentParams.lambda + 1 newMu := (currentParams.lambda*currentParams.mu + x) / newLambda newAlpha := currentParams.alpha + 0.5 diff := x - currentParams.mu newBeta := currentParams.beta + (currentParams.lambda*diff*diff)/(2*newLambda) newParams := &samplingParams{ mu: newMu, lambda: newLambda, alpha: newAlpha, beta: newBeta, } if atomic.CompareAndSwapPointer(&ts.params, oldPtr, unsafe.Pointer(newParams)) { return } } }
戦略別の事前設定
| 戦略 | 用途 | 主な事前パラメータ |
|---|---|---|
| Weight Two(高速で安定) | コールドスタートを活用 | 、、 |
| Default(汎用) | 積極的に探索 | 、、 |
- 高 Lambda → 初期推定への自信が強く、コールドスタート時の探索を抑制。
- 低 Alpha / Beta → 分散に対する信念が狭く、外れ値が大きな更新を引き起こし、モデルは再度探索へ移行します。
本番での結果
Auth0 FGA に微調整済みプランナーをデプロイすると、即座に成果が現れました:
- 複雑なモデルではピーク P99 レイテンシが 50 ms 未満 へ低下し、該当ワークロードで 98 % の削減 を実現。
- 多くのお客様で顕著な性能向上を確認。
- 従来のロジックが最適だったケースもあり、プランナーはそれらを検出して継続的に活用しました。
ローンチ前後の戦略選択比率から、実際のデータ分布に対するプランナーの適応様子が確認できます。
まとめ
- 統計モデル は、認可のような動的環境で手作業によるハードコードよりも頑健です。
- 高性能並行性を最初から優先することで、OpenFGA のクリティカルパスにほとんどオーバーヘッドを加えずにソリューションを統合しました。
- 自己調整プランナーは、OpenFGA コミュニティ全体に即座の価値を提供し、デフォルトでより高速かつ堅牢なシステムを実現します。