Orion 响应 RequestEntityTooLarge 的问题
Issues with Orion response RequestEntityTooLarge
我最近问了一个关于同时连接大量连接的问题,我得到的一个建议是我应该使用 BATCH 操作。谢谢你帮了大忙。
现在我遇到了奇怪的情况,我知道错误的含义和原因,但我不知道我的情况是如何发生的。
所以我有 2000 个实体,我将它们分成 500 个块(我知道我可以分成 1000 个甚至更多但现在我坚持使用 500 个)
然后我继续将它们创建为 4 个批处理操作,与我之前打开 2000 个连接的逻辑相比有了巨大的改进。
我正在为该操作使用请求承诺库,并且它们已成功创建,但这里的事情变得很奇怪。
即使它们创建成功我的请求承诺 returning 这个错误,
{
"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 ]
如您所见,它从第一批、第二批等开始...这里未定义不是问题,因为批次 return 成功时只有 204,我控制台日志正文而不是代码...
但是在最后一批完成后我得到了那个错误(创建了实体)。
如您所见,它显示错误,就像我将所有实体放在一个巨大的批次中一样是不正确的,即使我的实体已成功创建,也会显示此内容。现在我在这里缺少什么,为什么 Orion return 这个响应却继续以小批量操作正常创建实体?
任何建议都会有所帮助。
谢谢
我认为问题正是 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 个实体(<250 个实体),所以 Orion 可能已经正确处理了一个实体。
在这种情况下,客户端逻辑中通常使用的方法是在您的代码中使用某种累加器(例如 JSON 数组)。您可以实现一个循环来填充数组,累积每个实体的大小。当您接近限制 (e.e.800KB) 时,您发送批次,重置数组并从下一个开始。
我最近问了一个关于同时连接大量连接的问题,我得到的一个建议是我应该使用 BATCH 操作。谢谢你帮了大忙。
现在我遇到了奇怪的情况,我知道错误的含义和原因,但我不知道我的情况是如何发生的。
所以我有 2000 个实体,我将它们分成 500 个块(我知道我可以分成 1000 个甚至更多但现在我坚持使用 500 个)
然后我继续将它们创建为 4 个批处理操作,与我之前打开 2000 个连接的逻辑相比有了巨大的改进。 我正在为该操作使用请求承诺库,并且它们已成功创建,但这里的事情变得很奇怪。
即使它们创建成功我的请求承诺 returning 这个错误,
{
"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 ]
如您所见,它从第一批、第二批等开始...这里未定义不是问题,因为批次 return 成功时只有 204,我控制台日志正文而不是代码...
但是在最后一批完成后我得到了那个错误(创建了实体)。
如您所见,它显示错误,就像我将所有实体放在一个巨大的批次中一样是不正确的,即使我的实体已成功创建,也会显示此内容。现在我在这里缺少什么,为什么 Orion return 这个响应却继续以小批量操作正常创建实体?
任何建议都会有所帮助。
谢谢
我认为问题正是 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 个实体(<250 个实体),所以 Orion 可能已经正确处理了一个实体。
在这种情况下,客户端逻辑中通常使用的方法是在您的代码中使用某种累加器(例如 JSON 数组)。您可以实现一个循环来填充数组,累积每个实体的大小。当您接近限制 (e.e.800KB) 时,您发送批次,重置数组并从下一个开始。