【问题标题】:OPA HTTP self referential PUT request times outOPA HTTP 自引用 PUT 请求超时
【发布时间】:2019-12-13 21:39:43
【问题描述】:

我在 main 包中有两个策略,它们调用同一个实例(本地运行的 OPA 服务器),如下所示:

package main

get[response] {
    response := http.send({
        "method" : "GET",
        "url": "http://localhost:8181/v1/data/example"
    })
}

put[response] {
    response := http.send({
        "method" : "PUT",
        "url": "http://localhost:8181/v1/data/example",
        "body": { "example": true }
    })
}

我这样运行我的 OPA 服务器:

opa run -w -s main.rego --log-level debug --log-format text

当我 curl get 策略时,我收到 200 响应:

$ curl -X POST localhost:8181/v0/data/main/get
[{"body":{},"raw_body":"{}","status":"200 OK","status_code":200}]

但是,当我 curl 放置策略时,它会在 5 秒后超时:

$ curl -X POST localhost:8181/v0/data/main/put
{
  "code": "internal_error",
  "message": "error(s) occurred while evaluating query",
  "errors": [
    {
      "code": "eval_builtin_error",
      "message": "http.send: Put http://localhost:8181/v1/data/example: net/http: request canceled (Client.Timeout exceeded while awaiting headers)",
      "location": {
        "file": "main.rego",
        "row": 11,
        "col": 14
      }
    }
  ]
}

有谁知道为什么 PUT 而不是 GET 针对 OPA 实例的请求会发生这种情况?

同时类似的卷曲效果很好:

curl -X PUT -d "{}" http://localhost:8181/v1/data/example

我知道这是一个奇怪/糟糕的“用例”,但出于好奇,我想更好地了解 rego http 功能中发生了什么。

【问题讨论】:

    标签: open-policy-agent


    【解决方案1】:

    OPA 目前支持多个并发读取事务(例如,策略查询)和一个并发写入事务(例如,更新数据)。但是,当写入事务提交时,OPA 会一直等待,直到读取器完成。

    由于您是从策略查询内部执行写入操作,因此写入操作的提交会阻塞。这就是为什么您会看到带有put 规则的超时。您看不到 get 规则的超时,因为没有写入事务(所以没有任何阻塞。)

    这是 OPA 的实现细节。理论上,OPA 可以支持多个并发读取器和写入器,在这种情况下,您可以从策略查询中修改数据。这不是一个高优先级的功能。

    也就是说,我们不建议这样做。

    【讨论】:

    • 感谢 Torin 的及时回复。我说事务的读/写“分类”来自http动词是否正确? (我想我之前有一个针对 v0 数据 API 的 webhook 请求作为我的想法)
    • /data 上的 PUT、PATCH 和 DELETE 是修改 JSON 数据的写入这就是您使用 JSON 输入执行策略查询的方式。
    • 恐怕我还是有点糊涂。如果针对 v0/data 的 POST 是读取,那么当策略对同一实例发出 PUT 请求时;那不只是一个正在进行的写吗? (所以不会导致超时?)
    • 是的,只有一个写入器(即 PUT 请求),但是在读取器(即 POST 请求)完成之前无法提交写入。这就像一个线程在 rw 互斥锁上获取读锁,然后尝试在同一个互斥锁上获取写锁而不释放读锁。
    • 正确 - 明白了!感谢您的回答和澄清:)
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 2019-09-27
    • 1970-01-01
    • 2020-02-20
    • 2014-08-19
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多