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 (小米开源互联网企业级监控系统)

open-falcon的falcon-log-agent日志监控

强化学习中的重要概念

Policy-Based Method RL