【问题标题】:Calling Express get commands concurrently并发调用 Express get 命令
【发布时间】:2015-03-11 06:01:27
【问题描述】:

所以目前我有这个功能

app.get('/requestItems', function(req, res){
//Check if Bots are online
if(botQueue.length == 0){
  //If there are no bots in the queue to take the order, then we can't process it.
  console.log("Sorry no bots available");
  res.send("No Bots available ATM");
  return;
} else {
  var currentBot = botQueue.shift();
}
requestItems(currentBot.offerInstance, steamIDtoTrade, itemID, userAccessToken);

eventEmitter.on('requestOfferExpired', function(){
  console.log("Request offer has timed out/been cancelled");
  res.send("Request offer has timed out/been cancelled");
  botQueue.push(currentBot);
});
eventEmitter.on('requestOfferAccepted', function(){
  console.log("Request offer has completed");
  res.send("Request offer has completed");
  botQueue.push(currentBot);
});

});

当我调用它时,运行大约需要 5 分钟。在它运行时,我似乎无法向 URL 发出请求。我知道节点是单线程的,但是有没有办法并行/同时运行它?还是我只需要改变我的设计策略?

编辑:requestItems 函数:http://pastebin.com/Eif5CeEv

【问题讨论】:

  • 仅供参考,看起来您正在为每个新的 /requestItems 请求添加新的 eventEmitter 事件处理程序。我认为这意味着您在同一个 eventEmitter 上堆积了多个事件处理程序。
  • @jfriend00 我该如何解决这个问题?
  • 我没有很好地遵循您尝试对代码执行的操作,但您可能需要为每个活动请求一个新的 eventEmitter,而不是一个全局的,然后您需要确保您永远不会复制任何事件处理程序。
  • 但是如果我将 eventEmitter 移动到全局状态,我将如何发送响应?例如,如果我在这里移除发射器,那么我将没有响应范围。 i.imgur.com/2yVSkuj.png
  • 您将响应变量传递给任何想要创建并发送响应的代码。

标签: node.js events express concurrency parallel-processing


【解决方案1】:

如果每个请求的 5 分钟是 node.js 的 100% CPU 在没有 IO 的情况下运行,那么在此期间您将不会处理任何其他请求,并且您将需要在其中运行多个节点进程(可能在集群中)以便在此期间处理多个请求。

另一方面,如果这 5 分钟的大部分时间都在做 IO(磁盘、数据库或套接字),那么适当的异步 IO 设计将允许您的节点服务器在此期间处理许多请求。

由于您似乎不太可能在没有 IO 的情况下连续 5 分钟对 CPU 进行数字运算,我的猜测是您需要切换到适当的异步 IO 设计,然后才能利用 node.js 的优势并且可以同时处理许多不同的请求。


您需要更多地披露这 5 分钟内发生的事情,以便我们提供更具体的帮助。关于这 5 分钟的一些问题:

  1. 哪些类型的操作需要花费 5 分钟的时间?
  2. 您是否在使用 node.js 异步磁盘 IO 和异步数据库 IO 时允许其他 node.js 事件在给定请求等待 IO 时流动?
  3. 您的请求处理策略是否旨在同时处理多个请求?
  4. 您能否向我们展示需要 5 分钟的代码片段?

【讨论】:

  • 哦,其实主要部分用了
  • @Jake - 如果您使用计时器而不是循环进行轮询并且具有适当的设计,那么您可以在此期间处理数以百万计的请求。或者,更好的是,修复设计,这样您就不会轮询。向我们展示代码。
  • 我已将其添加到 OP,应该可以看到我在哪里使用了计时器。
  • @Jake - 所有steamOfferObj 方法都有什么作用?它们都是异步且快速的吗?您只有一个名为eventEmitter 的全局变量吗?还有,这是什么?如果是这样,你怎么可能同时运行多个请求? botQueue 有多大?
  • steamOfferObj 是 node-steamoffer 库的变量名。是的,它们都是异步且快速的。我只有一个 eventEmitter,有问题吗?机器人队列大约有 3000 多个机器人。抱歉,相对较新的节点!
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 2021-09-22
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多