Узел JS приоритетной обработки - PullRequest
0 голосов
/ 09 ноября 2018

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

UPDATE

Сценарий

Моя система работает следующим образом, Я создаю приложение для парсера RSS, которое должно иметь несколько источников (ссылки RSS) для новостей, и каждый источник имеет свой собственный процесс (функцию обратного вызова), чтобы получать новости каждые x минут, а затем после получения всех новостей показывать, если есть один новый Я должен сохранить его в БД, и если он существует, но обновлен, я должен обновить его в БД, поэтому в этом сценарии у меня много тяжелых процессов, выполняющихся для всех процессов, и если у многих из них есть одно и то же время для запуска зависания сервера, отвечающего на любые вызовы HTTP. Я думал, что у меня есть дочерний процесс, но я не могу сделать это в одном файле, чтобы запустить его в одиночку.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Типичным решением для чего-то подобного в node.js является разделение вашей работы на несколько процессов.

Пусть http-сервер, которому необходимо своевременно реагировать на входящие запросы, будет своим собственным процессом. Не заставляйте его делать что-либо еще, кроме полей входящих HTTP-запросов, извлечения данных из вашей базы данных и ответа на эти http-запросы. Если он запрограммирован должным образом со всеми асинхронными операциями ввода-вывода и ваша база данных должным образом масштабирована, чтобы отвечать требованиям, то это должно быть быстрым и реагирующим на любой запрос.

Используйте один или несколько отдельных процессов для выполнения многих задач, требующих обработки ЦП, таких как получение новостей, их анализ и помещение в базу данных. Вы можете запустить этот процесс отдельно или запустить его для процесса http-сервера (либо он будет работать нормально).

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

0 голосов
/ 09 ноября 2018

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

Из того, что я могу понять, кажется, что вы используете HTTP-сервер node.js, который также выполняет задания с интервалами (cron?). Возможно, эти задания выполняют задачи синхронизации, блокируя очередь цикла событий.

http-серверы Node.js не могут правильно работать с задачами синхронизации. Так как node.js является однопоточным, управляемым событиями, движок не может больше ничего делать при выполнении задач синхронизации до самого конца задач.

Вы должны запустить другой процесс для тяжелых операций синхронизации.

const exec = require('child_process').exec;
exec('node your-sync-script.js', (e, stdout, stderr)=> {
    if (e instanceof Error) {
        console.error(e);
        throw e;
    }
    console.log('stdout ', stdout);
    console.log('stderr ', stderr);
});

Но, как я уже сказал, было бы полезно больше информации о вашей архитектуре, логике задач и спецификациях среды. Если ваши API используют базу данных и во время выполнения ваших задач cron вы сбрасываете данные, транзакции или что-то в этом роде, также возможно, что вы блокируете базу данных, и запросы https ожидают данных базы данных.

...