我看到一些较旧的帖子涉及这个主题,但我想知道当前的现代方法是什么。
用例是:(1)假设您要对视频文件执行长时间运行的任务,比如60秒,说jspm install
可能需要60秒。 (2)你不能细分任务。
其他要求包括:
我见过这些解决方案:
哪种是现代的,基于标准的方法?此外,如果nodejs不适合这种类型的任务,那么这也是一个有效的答案。
答案 0 :(得分:12)
简短的回答是:取决于
如果您的意思是nodejs 服务器,那么对于此用例,答案是。 Nodejs的单线程事件无法处理CPU绑定任务,因此将工作外包给另一个进程或线程是有意义的。但是,对于CPU绑定任务运行很长时间的这种用例,找到一些排队任务的方法是有意义的...即,使用工作队列是有意义的。
但是,对于运行JS代码(jspm API
)的特定用例,使用使用nodejs的工作队列是有意义的。因此,解决方案是:(1)使用nodejs服务器,该服务器除了在工作队列中排队任务外什么都不做。 (2)使用nodejs工作队列(如kue
)来完成实际工作。使用cluster
将工作分散到不同的CPU。结果是一个简单的单服务器,可以处理数百个请求(没有窒息)。 (好吧,差不多,请看下面的注释......)
注意:
kue
这样的数据库支持的工作队列,这是微不足道的 - 只需让每个点服务器指向同一个数据库) 。 答案 1 :(得分:4)
你提到了一个CPU绑定的任务,以及一个长期运行的任务,这绝对不是node.js的事情。你还提到了数百个同步任务。
你可以看一下类似Gearman job server之类的东西 - 这是一个专门的解决方案。
或者,您仍然可以让Node.js管理请求,而不是执行实际的作业。
如果具有较低的最佳性能是相对可接受的,并且您希望将代码保留在JavaScript中,您仍然可以执行此操作,但是您应该拥有某种类型的作业队列 - 想到Redis或RabbitMQ等。< / p>
我认为无论运行时间如何,作业队列都是长时间运行,数百/秒任务的必备条件。除非您可以在其他服务器/服务/机器上生成此作业 - 那么您不关心,您的Node.js API只是作业集群的前端和管理层,然后Node.js完全可以胜任这项工作,你需要专注于那个工作集群,然后你可以提出一个更好的问题。
现在,node.js
对您来说仍然有用,它可以帮助管理和保存这些数百个任务,具体取决于它们的来源(即,您可能只允许请求进入您的作业服务器某些用户,或将“暂停”功能限制为他人等。