#8911·opa

组件插件:在初次多组件激活时,编译成本为 O(n²)

作者: jsteinberg创建于 2026年7月20日更新于 2026年9月8日

你要解决的根本问题是什么?

当 OPA 配置了大量的束(例如通过发现),初始启动由于二次(O(n²))编译成本而极其缓慢。每个束在下载完成后都被单独激活,每次激活都重新编译之前加载的 所有 模块。在我们的生产部署中,我们有一个测试配置,加载了 80 个束(每个约 8-10 个 Rego 文件,总共约 800 个模块)。启动需要 数分钟,因为:

  1. 串行激活Plugin.oneShot() 保持 p.mtx(plugin.go:479),因此束激活是串行的,即使下载是并行的。
  2. 每次激活都重新编译:对 Plugin.activate() 的调用创建了一个新的 ast.NewCompiler()(plugin.go:627)和 compileModules()(store.go:962-993)收集了之前激活的所有模块以及新束的模块,然后对整个集合调用 compiler.Compile(modules)
  3. 二次总工作量:束 1 编译 10 个模块,束 2 编译 20 个,…,束 80 编译 800 个。总计:约 32,400 次模块编译,而如果一次编译则为约 800 次。

内容来源: open-policy-agent/opa