Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Heroku和node.js上的每个请求上运行的后台作业_Node.js_Heroku_Express_Web Worker - Fatal编程技术网

在Heroku和node.js上的每个请求上运行的后台作业

在Heroku和node.js上的每个请求上运行的后台作业,node.js,heroku,express,web-worker,Node.js,Heroku,Express,Web Worker,我有一个应用程序需要运行一个很长的过程(每个请求需要30-60秒)。处理完成后,结果作为响应返回给请求。这在本地运行得很好,但会使我的Heroku实例崩溃 我希望发生的是: 用户进入站点,请求发送到后端 后端立即返回,并启动另一个进行处理的进程/任务/作业 当处理结束时,响应将返回给正确的用户 我不知道我需要什么。基于一个小时的研究,我似乎可以使用Redis作为队列,工作人员可以每x分钟轮询一次。但我不明白的是,在处理结束后,如何确定将响应发送到哪个请求 是否有此示例的Express/nod

我有一个应用程序需要运行一个很长的过程(每个请求需要30-60秒)。处理完成后,结果作为响应返回给请求。这在本地运行得很好,但会使我的Heroku实例崩溃

我希望发生的是:

  • 用户进入站点,请求发送到后端
  • 后端立即返回,并启动另一个进行处理的进程/任务/作业
  • 当处理结束时,响应将返回给正确的用户
我不知道我需要什么。基于一个小时的研究,我似乎可以使用Redis作为队列,工作人员可以每x分钟轮询一次。但我不明白的是,在处理结束后,如何确定将响应发送到哪个请求


是否有此示例的Express/node.js?任何指针都是有用的。

就像您在研究中发现的那样,使用Redis设置工作队列对于长时间运行的进程来说是一种很好的方法。这是一个很好的图书馆

当涉及到用作业结果响应请求时,让outanding request挂起等待响应并不是一个好方法(heroku可能不起作用,它会杀死已闲置一段时间的请求)


您可以做的是,当请求发出时,启动后台作业并立即使用作业ID响应请求。然后,客户端可以轮询服务器以了解作业的状态,当作业完成后,它可以获取所需的结果。

Kue(来自@mattere的答案)不再被维护。Kue的GitHub页面建议作为一个好的选择。对于Node.js来说,它是一个快速可靠的基于Redis的队列。

kue
不太好。我还没有为nodejs找到任何好的解决方案,所以最好编写自己的队列管理器。@happy_marmoset为什么kue不好?