ECONNRESET 在短时间内开启大量连接时

ECONNRESET when opening a large number of connection in small time period

我想在 Orion 上创建大量实体。我正在使用 docker 版本的 Orion 和 mongo 与此 docker-compose.

version: "3"
services:
  mongo:
    image: mongo:3.4
    volumes:
      - /data/docker-mongo/db:/data/db
      - /data/docker-mongo/log/mongodb.log:/var/log/mongodb/mongod.log
    command: --nojournal
  orion:
    image: fiware/orion
    volumes:
      - /data/docker-mongo/log/contextBroker.log:/tmp/contextBroker.log
    links:
      - mongo
    ports:
      - "1026:1026"
    command: -dbhost mongo

现在当我想上传 2000 个实体时出现问题(为每个实体打开新连接,我知道可以做不同的但现在这是请求),我成功创建不超过 600 个(或更少,从来没有确切的数字) 其中其余部分无法创建并出现错误:

"error": {
            "errno": "ECONNRESET",
            "code": "ECONNRESET",
            "syscall": "read"
        },

所以我认为这个问题与 Orion 中的 maxConnections、reqPoolSize 等设置有关。但是在 docker 中我找不到 Orion 配置文件,当我键入 contextBroker -maxConnections 123456 之类的命令时,我无法知道该设置正在被 Orion 和 docker 容器接受。

Orion 的日志也是空的,当 Orion 在 docker 上 运行 时,我无法确定是什么导致了这个问题。

所以主要问题:

如果您有一些 advice/soultion,那将会很有帮助。 谢谢

{
"orion" : {
"version" : "1.13.0-next",
"uptime" : "2 d, 15 h, 46 m, 34 s",
"git_hash" : "ae72acf9e8eeaacaf4eb138f7de37bfee4514c6b",
"compile_time" : "Fri May 4 10:12:18 UTC 2018",
"compiled_by" : "root",
"compiled_in" : "1901fd6bb51a",
"release_date" : "Fri May 4 10:12:18 UTC 2018",
"doc" : "https://fiware-orion.readthedocs.org/en/master/"
}
}



{ Error: socket hang up
at createHangUpError (_http_client.js:313:15)
at Socket.socketOnEnd (_http_client.js:416:23)
at Socket.emit (events.js:187:15)
at endReadableNT (_stream_readable.js:1090:12)
at process._tickCallback (internal/process/next_tick.js:63:19) code: 'ECONNRESET' }


error:
{ Error: connect ECONNREFUSED ipofvirtualm:1026
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1174:14)
 errno: 'ECONNREFUSED',
 code: 'ECONNREFUSED',
 syscall: 'read',
 address: 'ipofvm',
 port: 1026 },

options:
{ method: 'POST',
 uri: 'http://ip:1026/v2/entities?options=keyValues',
 headers:
  { 'Fiware-Service': 'some service',
    'Fiware-ServicePath': 'some servicepath' },
 body:
  { id: 'F0B935',
    type: 'Transaction',
    refEmitter: 'F0B935',
    refReceiver: '7501JXG',
    refCapturer: 'testtdata',
    date: '12/12/2017 13:25',
    refTransferredResources: 'testtdata',
    transferredLoad: 92 },
 json: true,
 callback: [Function: RP$callback],
 transform: undefined,
 simple: true,
 resolveWithFullResponse: false,
 transform2xxOnly: false },

我正在使用请求承诺库进行调用,我尝试其他人遇到同样的问题。现在,由于我无法向您发送所有 2000 条回复,我将尝试描述。所以当我开始发送它时它表现良好。它创建大约 30 个实体,然后接下来的几个或更多 return 响应说 ECONNRESET 然后它再次开始创建等等。

让我感到困惑的是,它并没有完全失败,这意味着它可以工作,但没有按预期进行。此外,Orion 似乎关闭了套接字或将其挂起一段时间,然后他再次打开并正常创建等等。如果您需要更多信息,请询问,感谢您的快速回答。

为什么不使用

而不是为每个实体打开一个新连接
POST /v2/op/update 

并在一批中创建所有实体?或几批

查看一些代码在

https://github.com/Fiware/dataModels/blob/master/Weather/WeatherObserved/harvest/spain_weather_observed_harvest.py#L235

关于在 docker 中传递给 CB 运行 的 CLI 参数,使用 docker 撰写文件中的 command 行,例如:

command: -dbhost mongo -maxConnections 123456

但是,我不确定这是否有助于解决问题,因为 Orion 无需任何特殊定制即可处理您的用例。查看错误消息(这似乎与 TCP 层的一些问题有关)我想知道 docker 网络层是否在某种程度上成为瓶颈...

此外,Jose Manuel Cantera 关于使用 POST /v2/op/update 的建议是个好主意。这将减少网络层的连接压力,并可能有助于缓解问题。

如果您无法更改更新策略,或许使用请求间延迟 (100-200ms) 也有帮助。