【问题标题】:Issues with Orion response RequestEntityTooLargeOrion 响应 RequestEntityTooLarge 的问题
【发布时间】:2018-06-13 12:25:19
【问题描述】:

我最近问过关于同时连接大量的问题,我得到的建议之一是我应该使用 BATCH 操作。谢谢你,它帮了很多忙。

Link to topic

现在我遇到了奇怪的情况,我知道错误是什么意思以及导致它的原因,但我不知道我的情况是如何发生的。

所以我有 2000 个实体,我将它们分成 500 个块(我知道我可以分成 1000 个甚至更多,但现在我坚持使用 500 个)

然后我继续将它们创建为 4 个批处理操作,与我之前打开 2000 个连接的逻辑相比有了巨大的改进。 我正在为该操作使用请求承诺库,并且它们已成功创建,但这里的事情变得很奇怪。

即使它们已成功创建,我的请求也承诺返回此错误,

{
    "name": "StatusCodeError",
    "statusCode": 413,
    "message": "413 - {\"error\":\"RequestEntityTooLarge\",\"description\":\"payload size: 1487638, max size supported: 1048576\"}",
    "error": {
        "error": "RequestEntityTooLarge",
        "description": "payload size: 1487638, max size supported: 1048576"
    },
    "options": {
        "method": "POST",
        "headers": {
            "Content-Type": "application/json",
            "Fiware-Service": "waste4think",
            "Fiware-ServicePath": "/deusto/w4t/zamudio/test"
        },
        "uri": "http://localhost:1026/v2/op/update?options=keyValues",
        "body": {
            "actionType": "UPDATE",
            "entities": [ 2000 entities ]},
        "json": true,
        "simple": true,
        "resolveWithFullResponse": false,
        "transform2xxOnly": false
    },
    "response": {
        "statusCode": 413,
        "body": {
            "error": "RequestEntityTooLarge",
            "description": "payload size: 1487638, max size supported: 1048576"
        },
        "headers": {
            "connection": "close",
            "content-length": "100",
            "content-type": "application/json",
            "fiware-correlator": "48689168-6ef7-11e8-a270-0242ac110003",
            "date": "Wed, 13 Jun 2018 10:48:18 GMT"
        },
        "request": {
            "uri": {
                "protocol": "http:",
                "slashes": true,
                "auth": null,
                "host": "localhost:1026",
                "port": "1026",
                "hostname": "localhost",
                "hash": null,
                "search": "?options=keyValues",
                "query": "options=keyValues",
                "pathname": "/v2/op/update",
                "path": "/v2/op/update?options=keyValues",
                "href": "http://localhost:1026/v2/op/update?options=keyValues"
            },
            "method": "POST",
            "headers": {
                "Content-Type": "application/json",
                "Fiware-Service": "waste4think",
                "Fiware-ServicePath": "/deusto/w4t/zamudio/test",
                "accept": "application/json",
                "content-length": 1487638
            }
        }
    }
}

我在控制台记录我的流程

Sending: 0 500
Sending: 1 500
Sending: 2 500
Sending: 3 500
Sending: 4 134
[ undefined, undefined, undefined, undefined, undefined ]

如您所见,它从第一批、第二批等开始...此处未定义不是问题,因为批处理在成功时仅返回 204,并且我控制台日志正文而不是代码...

但是在最后一批完成后,我得到了那个错误(实体被创建)。

您可以看到它显示错误,就像我将所有实体放在一个大批次中一样,这不是真的,即使我的实体已成功创建,也会显示此内容。现在我在这里缺少什么,为什么 Orion 会返回此响应但继续以小批量操作正常创建实体?

任何建议都会有所帮助。

谢谢

【问题讨论】:

  • 似乎我如何划分块的方式引起了问题,我改变了我的逻辑并从 for 到 while 改变。我会做一些额外的测试来确认它。

标签: fiware fiware-orion


【解决方案1】:

我认为问题正是 Orion 告诉您的问题:

"payload size: 1487638, max size supported: 1048576"

因此,您在 POST /v2/op/update 中发送 1487638 个有效负载字节,而 Orion 允许 1MB 与 described in documentation 一样多。

假设 500 个实体占用 1487638(平均),那么 250 个应该占用一半,大约 700000 字节。鉴于 ~700000 字节小于 1MB,这就足够了。事实上,您的上一批似乎有 134 个实体(

在这种情况下,客户端逻辑中通常使用的方法是在代码中使用某种累加器(例如 JSON 数组)。您可以实现一个循环来填充数组,累积每个实体的大小。当您接近限制(例如 800KB)时,您发送批处理,重置数组并从下一个开始。

【讨论】:

  • 感谢您的帮助,问题已解决,错误出在我而不是 Orion。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 2010-11-20
  • 2017-05-10
相关资源
最近更新 更多