NodeJS性能-多路由与单路由

时间:2018-11-16 13:59:53

标签: node.js concurrency

我已经在Node.js中创建了一个端点。

以下是终点:

app.post('/processMyRequests',function(req,res){

switch(req.body.functionality) {
    case "functionalityName1":
        jsFileName1.functionA(req,res);
        break;
    case "functionalityName2":
        jsFileName2.functionB(req,res);
        break;
    default:
        res.send("Sorry for that");
        break;
}
});

在每个函数中,均会完成对API的调用,然后处理数据,最后将响应发送回去。

我的问题:

  1. 由于Node.js作为默认值异步处理请求,因此我们能否为所有响应设置一条路由?
  2. 并发性是否会成为问题,即当并行命中发生在单个路由中时,Node.js会停止还是变慢?
  3. 如果对问题(2)的回答为“是”,那么当我有单独的路由时,它将发生怎样的变化,即,如果相同数量的请求进入一条特定的路由,那将是同一问题吧?

如果有人可以共享实时用例,那将很高兴。谢谢

1 个答案:

答案 0 :(得分:2)

  1. 从技术上讲,您可以为所有响应提供一条途径,但是创建紧凑,明确目标功能/目的且不太复杂的端点被视为“更好的实践”;在您的示例中,路由可能采用了许多可能的代码分支。这要求每个分支具有唯一的逻辑,这增加了端点的复杂性,并且使代码不那么清晰。想象一下,当发生错误时,当您可以为每个唯一的“分支”创建一个单独的端点时,您现在必须调试潜在的多个不同文件和端点的不同分支。
    • 随着应用程序的大小和复杂性的增长,您将需要一种简单的方法来管理API。在一个端点中放入很多东西对于您进行维护和调试将是一场噩梦。
    • 查看一些有关如何设计和实现API的教程/文档可能对您很有用,这是Scotch.io的精彩文章

问题一的示例:

// GET multiple records
app.get('/functionality1',function(req,res){
   //Unique logic for functionality
});

// GET a record by an 'id' field
app.get('/functionality1/:id',function(req,res){
   //Unique logic for functionality
});

// POST a new record
app.post('/functionality1',function(req,res){
   //Unique logic for functionality
});

// PUT (update) a record
app.put('/functionality1',function(req,res){
   //Unique logic for functionality
});

// DELETE a record
app.delete('/functionality1',function(req,res){
   //Unique logic for functionality
});

app.get('/functionality2',function(req,res){
  //Unique logic for functionality
});
...

相对于必须在一个API端点中消化许多技术上不相关的逻辑,这使您对每个端点所发生的事情有了更清晰的了解。总结一下,最好使端点的目的和范围清晰明了。

  1. 这实际上取决于逻辑的实现方式。显然,Node.js是单线程的。这意味着它一次只能处理1个“流”的代码(没有真正的并发或并行性)。但是,Node gets around this through its event-loop。您可能看到的问题取决于是否编写了asynchronous (non-blocking) code, or synchronous (blocking) code。在Node中,几乎总是更好,建议编写非阻塞代码。这有助于防止阻塞事件循环,这意味着您的节点应用程序可以在执行其他操作的同时,例如等待文件读完,API调用完成或承诺解决。 编写阻止代码将导致应用程序出现瓶颈/“挂起”,最终用户将其视为更高的延迟时间

  2. 具有多条路线,或一条路线无法解决此问题。更多有关如何利用(或不利用)事件循环的信息。尽可能多地使用异步代码非常重要。

    • 如果绝对必须使用同步代码(这实际上是一种不管代码同步性如何利用的好方法),您可以做的一件事就是实现microservice architecture,服务可以在其中处理阻塞(或资源)。 -密集)代码从您的API节点服务中删除。这将释放您的API服务,以便尽快处理请求,而将繁重的工作留给其他服务。
    • 另一种可能性是利用clustering。通过产生与主进程相同的“工作”进程,您可以像运行多线程一样运行节点,其区别在于它们可以单独处理工作。如果您期望自己将拥有非常繁忙的API服务,则这种方法非常有用。

一些非常有用的资源: