Open Policy Agent - 提高分组理解的性能
Posted
技术标签:
【中文标题】Open Policy Agent - 提高分组理解的性能【英文标题】:Open Policy Agent - Improve performance of a grouping comprehension 【发布时间】:2021-02-04 19:05:12 【问题描述】:我有以下格式的 id 和角色映射
"ra": [
"id": 168,
"code": "AFAP"
,
"id": 180,
"code": "ABC"
,
"id": 180,
"code": "ABCMND"
]
我需要输出如下所示
"roleactions":
"168": [
"AFAP"
],
"180": [
"ABC",
"ABCMND",
"DCRMP"
]
所以我写了下面的代码
roleactions = r_map
r := data.ra
r_map := id: list |
some i
id := r[i].id
list := [obj |
some j
r[j].id == id
obj := r[j].code
]
但是当我运行它时,它几乎需要 5-6 秒
在 5682526.465 µs 内找到 1 个结果。
有人可以指导如何编写此策略图以提高性能吗?
【问题讨论】:
【参考方案1】:OPA 可以在线性时间内评估这样的理解:https://www.openpolicyagent.org/docs/latest/policy-performance/#comprehension-indexing。这种情况下的问题是局部变量r
在单独考虑推导时并不安全。
如果你像下面这样重构理解,运行时应该是线性的:
roleactions := r_map
r_map := id: list |
some i
id := data.ra[i].id
list := [obj |
some j
data.ra[j].id == id
obj := data.ra[j].code
]
【讨论】:
谢谢,这确实有所作为,并使其快速到 23 毫秒。但我用 ra 变量做的原因是因为实际上它是一个很长的对象。它更像data.response.body.ABC["<long string>"]["<long string>"]
,所以重复整个对象变得相当难看。最好的方法是什么?
如果通过data
的路径实际上是静态的,那么您可以通过导入创建一个别名:import data.response.body.ABC["<long string>"]["<long string>"] as x
,然后在您的规则中引用x
。优化仍应启动。
酷,我会用那个以上是关于Open Policy Agent - 提高分组理解的性能的主要内容,如果未能解决你的问题,请参考以下文章
Dapr 集成 Open Policy Agent 实现 接口的访问控制
[ k8s-operator 系列 ] 自动生成 webhook 证书并在过期时自动刷新
Open-Falcon第三步安装Agent (小米开源互联网企业级监控系统)