ECONNRESET при открытии большого количества соединений за небольшой промежуток времени - PullRequest
0 голосов
/ 27 мая 2018

У меня есть ситуация, когда я хочу создать большое количество объектов на Орионе.Я использую 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"
        },

Так что я предполагаю, что эта проблема как-то связана с maxConnections,настройки reqPoolSize и т. д. в Orion.Но в Docker мне не удалось найти файл конфигурации Orion, и я не знаю, когда я набираю такие команды, как contextBroker -maxConnections 123456, что настройки принимаются Orion и контейнером Docker.

Также журнал Orion пуст, иЯ не могу определить, что вызывает эту проблему, когда Орион работает на докере.

Итак, основные вопросы:

  • Можно ли использовать Orion, работающий на докере, так же, как Orion, работающий на ВМ (есть ли запасные варианты)
  • И как мне это сделать?проверьте эту проблему, когда Орион работает в докере, потому что я прочитал много документов / проблем, но не повезло (или я что-то упустил).

Если у вас есть какой-либо совет / совет, это действительно поможет.Спасибо

{
"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 сущностей, затем несколько следующих или более возвращаемых ответов с сообщением ECONNRESET, затем он начинает создавать снова и т. Д.

Что меня смущает, так это то, что он не полностью отказывает, то есть работает, но не так, как задумано.Также кажется, что Орион закрыл сокет или повесил его на некоторое время, затем он снова открылся и создал как обычно, и так далее.Если вам нужна дополнительная информация, спросите, и спасибо за быстрый ответ.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Что касается передачи аргумента CLI в CB, работающий в Docker, используйте строку command в файле компоновки Docker, например:

command: -dbhost mongo -maxConnections 123456

Однако я не уверен, что это поможет решитьпроблема, так как Орион должен иметь дело с вашим вариантом использования без какой-либо специальной настройки.Глядя на сообщение об ошибке (которое, похоже, связано с некоторой проблемой на уровне TCP), мне интересно, действует ли сетевой уровень докера как узкое место ...

Кроме того, предложение, сделанное Жозе Мануэлем Кантерой оиспользование POST /v2/op/update было бы хорошей идеей.Это уменьшит нагрузку на соединение на сетевом уровне и может помочь решить проблему.

Если вы не можете изменить свою стратегию обновления, возможно, может помочь задержка между запросами (100-200 мс).

0 голосов
/ 28 мая 2018

вместо открытия нового соединения для каждой сущности, почему бы вам не использовать

POST /v2/op/update 

и создать все сущности в одном пакете?или несколько партий

См. некоторый код на

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

...