процесс узла перестает отвечать, когда ресурсы доступны - PullRequest
0 голосов
/ 21 января 2020

Я работаю над серверным приложением, которое обрабатывает тонны данных, поступающих через веб-сокет, и у меня возникают проблемы с ним.

Используемая мной машина:

  • Intel Xeon 3,6 ГГц, 22 ядра, 44 потока, кэш-память 55 МБ
  • 256 ГБ Ram
  • 1 Гбит, сеть

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

const connect = () => {
    ws = new WebSocket(config.connectAddress, {
        perMessageDeflate: false
    });

    ws.on("open", open);

    ws.on("message", message);

    ws.on("error", error);

    ws.on("close", close);
};

const message = data => { // executed every 1 - 20 ms
    let parseStream = JSON.parse(data);
    let { channel, ...props } = parseStream;

    if (
        channel === "new" &&
        manager.validateRecord(props) === true
    ) {
        manager.addRecord(props);
    }

    if (channel === "updated") {
        manager.updateRecord(props);
    }

    if (channel === "deleted") {
        manager.removeRecord(props);
    }
};

const updateRecord = data => { // manager.updateRecord
    source.update(data);
    broadcast.run('update', data);
};

const run = (type, data) => { // broadcast.run
    io.emit(type, data);
};

В этот момент я получаю данные с событием message. Данные поступают как объект с около 30 ключами и значениями. Частота сообщений составляет около 1-20 мс. Я обрабатываю эти данные, чтобы проверить наличие обновлений, и храню их в памяти, и если что-то изменилось, я передаю их подключенным клиентам через socket.io.

. После момента запуска приложения оно перестает отвечать на запросы. Я отслеживал ресурсы сервера, и они почти полностью бесплатны. 1% ЦП и 1 ГБ оперативной памяти в использовании. Таким образом, кажется, что процесс забивается частотой сообщений и операций, выполняемых с каждым сообщением.

Возможно ли использовать кластерный или другой метод, поэтому серверный компьютер фактически использует все свои доступные ресурсы для жизненного цикла приложения (прослушивание данных, добавление / обновление / обработка данных, широковещательные данные)?

...