Node js优先级处理

时间:2018-11-09 12:14:04

标签: node.js asynchronous

如果我有一个节点js服务器,则有许多繁重的进程在特定时间段内工作,并且可能在同一时间内工作。因此,服务器此时将非常繁忙。 如果我们必须在服务器繁忙时处理请求,那么最好的方法就是优先处理该请求。

更新

场景

我的系统正在如下运行, 我构建了一个RSS分析器应用程序,该应用程序需要新闻的某些消息源(RSS链接),并且每个消息源都有其自己的流程(回调函数),以便每隔X分钟获取新闻,然后在获取所有新闻节目之后,是否有一个新消息我应该将其存储在DB中,如果它存在但已更新,则应该在DB中对其进行更新,因此在此脚本中,我为所有进程运行了许多繁重的进程,并且如果有许多运行相同时间的服务器挂起响应任何HTTP调用。 我以为有一个子进程,但是我无法在一个文件中单独运行它。

2 个答案:

答案 0 :(得分:2)

您应该提供更多信息,以使我们了解系统中的瓶颈/不良模式。

据我了解,似乎您正在运行一个node.js HTTP服务器,该服务器也以(cron?)间隔执行作业。也许这些作业正在执行同步任务,从而阻塞了事件循环队列。

Node.js http服务器无法正确处理同步任务。由于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请求被唤醒。

答案 1 :(得分:1)

node.js中类似的典型解决方案是将您的工作分成多个进程。

让需要及时响应传入请求的http服务器成为它自己的过程。除了字段传入的HTTP请求,从数据库中检索数据并对这些HTTP请求做出响应之外,别无其他要求。如果使用所有异步I / O对其进行了正确的编程,并且您的数据库已正确缩放以进行响应,那么这应该是快速且可响应任何请求的。

使用一个或多个单独的进程来完成需要大量CPU处理的工作,例如获取新闻,解析新闻并将其放入数据库中。您可以单独运行此过程,也可以让http服务器进程为您启动它(两者都可以正常工作)。

如果上述http服务器需要直接与新闻获取过程进行通信(而不是通过数据库),则可以在获取过程中放置​​本地可访问的http服务器,并让上述http服务器将http请求发送至获取指示或从中检索内容的过程。