FIWARE - Orion Context Broker 偏移参数行为

FIWARE - Orion Context Broker offset parameter behaviour

我面临以下关于 FIWARE Orion Context Broker 的问题,希望有人对此有所了解。

我将记录存储在 FIWARE Orion CB 版本 1.2.0 中,运行 在一个 Docker 实例中,在一种类型中,我在向 [=12= 发出 GET 调用后收到以下响应]

{
    "attrs": {
        "cid": {
            "types": [
                "String"
            ]
        },
        "datetime": {
            "types": [
                "String"
            ]
        },
        "humidity": {
            "types": [
                "Float"
            ]
        },
        "luminosity": {
            "types": [
                "Integer"
            ]
        },
        "temperature": {
            "types": [
                "Float"
            ]
        }
    },
    "count": 55811
}

如您所见,“计数”为 55811。但是,当我向 http://mywebsite.eu:1026/v2/entities?type=MyTYPE&offset=54908&limit=1 发送另一个 GET 调用时,我收到以下信息:

[
    {
        "id": ".*",
        "type": "MyTYPE"
    }
]

从那个偏移量 (54908) 开始,响应是相同的。我检查了我的服务器中的 space 并且有很多,所以这不是磁盘 space 的问题。我已经检查过数据是否以与之前相同的方式从我的 Raspberries 发送到 Orion CB。所以,我的问题是 Orion 可以存储的每种类型的记录是否有上限,当达到此限制时我应该更改类型。也许我缺少一些东西,你能给我的任何建议都会对我有很大帮助。

offset 参数表示在 returning 结果之前必须跳过多少个元素。因此,offset=0(如果省略了 offset 参数,则为默认值)表示从第一个元素开始,offset=1 表示从第二个元素开始,so.

让我们考虑 ASN 类型,它有 54879 个实体(如 GET /v2/types/ASN 所示)。使用 offset=0 我们得到第一个实体(恰好是 id 1470515373636_1 的实体):

GET /v2/entities?type=ASN&limit=1

[
  {
    "id": "1470515373636_1"
    ...
  }
]

现在让我们使用偏移量 54878(等于 ASN 实体总数减一)。也就是说,跳过前 54878 个实体只剩下最后一个(id 恰好是 1480344938807_1):

GET /v2/entities?type=ASN&offset=54878&limit=1

[
  {
    "id": "1480344938807_1"
    ...
  }
]

请注意,如果我们使用等于实体总数(或任何更大的数字)的偏移量,即 54879,这意味着所有实体都已被跳过。换句话说,我们正在超越极限。因此在那种情况下 Orion return 一个空的实体列表是正常的:

GET /v2/entities?type=ASN&offset=54879&limit=1

[]

另一个 "consistency" 检查:如果你颠倒顺序(默认情况下,实体按创建日期递增排序,即从旧到新,但你可以使用 orderBy 参数更改它)您可以检查以前的第一个元素现在是最后一个元素,反之亦然。特别是,orderBy=!dateCreated 通过减少创建日期(即从新到旧)对结果进行排序。

因此,现在搜索第一个元素 return 前一个元素(即 1480344938807_1

GET /v2/entities?type=ASN&limit=1&orderBy=!dateCreated

[
  {
    "id": "1480344938807_1"
    ...
  }
]

并搜索最后一个元素 return 前最后一个(即 1470515373636_1

GET /v2/entities?type=ASN&offset=54878&limit=1&orderBy=!dateCreated

[
  {
    "id": "1470515373636_1"
    ...
  }
]

让我们再做一个测试。让我们添加一个新的 ASN 实体,只是为了好玩:

POST /v2/entities?options=keyValues

{
  "id": "TestingEntity",
  "type": "ASN",
  "A": 42
}

所以,现在 ASN 类型的实体总数为 54880。新实体是最后创建的实体,因此它将以默认顺序(即增加创建日期)放在最后。您可以使用以下查询进行检查:

GET /v2/entities?type=ASN&offset=54879&limit=1

[
  {
    "id": "TestingEntity"
    ...
  }
]

请注意,在添加新实体(见上文)之前 returned [] 查询。

总之,Orion Context Broker 的行为在偏移参数方面似乎符合预期。你说问题是 Orion 在特定的偏移量后不会 return 正确的结果,但请注意,如果你的偏移量超过元素总数,空结果是正确的结果。

据观察,使用较大的偏移值可能会产生以下效果:

  • 您得到的答复是问题 post 提到的答复,例如:

    [
        {
            "id": ".*",
            "type": "ASN"
        }
    ]
    
  • Orion 日志中出现类似这样的错误消息:

    Raising alarm DatabaseError: nextSafe(): { $err: "Executor error: OperationFailed Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.", code: 17144 }
    

解决方案是在用于排序的数据库字段中创建索引。在默认排序(基于创建日期)的情况下,索引可以在 Mongo shell 处创建,如下所示(假设 orion 是您正在使用的数据库的名称):

$ mongo
> use orion
> db.entities.createIndex({creDate: 1})

事实上,创建 in this section in the documentation.

中描述的索引过去是个好主意

编辑:响应不正确:Orion 应使用 500 内部服务器错误以及有关该问题的描述性消息进行响应。此修复已准备好在 master 分支中发布,并将包含在 Orion 1.7.0(将于 2017 年初发布)中。