FIWARE - Orion Context Broker偏移参数行为

时间:2016-11-02 09:21:15

标签: fiware-orion

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

我将记录存储在FIWARE Orion CB版本1.2.0中,在Docker实例中运行,在一种类型中,我在向http://mywebsite.eu:1016/v2/types/MyTYPE发送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)及以上,响应是相同的。我已经检查了服务器中的空间并且有足够的空间,所以这不是磁盘空间问题。我已经检查过数据是从Raspberries中以与以前相同的方式进入Orion CB。所以,我的问题是,如果Orion可以存储的每种类型的记录有一个上限,当达到此限制时,我应该更改类型。也许有一些我缺少的东西,你给我的任何建议都会对我有所帮助。

2 个答案:

答案 0 :(得分:0)

offset参数表示在返回结果之前必须跳过多少个元素。因此,offset = 0(如果忽略偏移参数则为defaulf值)表示从第一个元素开始,offset = 1表示从第二个元素开始,即为。

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

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

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

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

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

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

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

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

[]

另一个"一致性"检查:如果您反转顺序(默认情况下,实体按增加创建日期排序,即从较旧到较新,但您可以使用orderBy参数更改),您可以检查前一个元素现在是最后和反之亦然。特别是,orderBy=!dateCreated订单的结果是减少创建日期(即从较新到较旧)。

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

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

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

并搜索最后一个元素返回前一个元素(即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"
    ...
  }
]

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

总之,Orion Context Broker行为似乎与offset参数一样。你说问题是Orion在特定的偏移数字后不会返回正确的结果,但是请注意,如果你的偏移超过了元素的总数,那么空结果是正确的结果。

答案 1 :(得分:0)

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

  • 您得到的答案是问题帖子提到的答案,例如:

    [
        {
            "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 }
    

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

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

事实上,创建描述为in this section in the documentation的索引是个好主意。

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