the page about using worker dynos and background jobs上的Heroku开发中心指出,您需要使用工作人员的+队列来处理API调用,例如获取RSS feed,因为如果服务器运行缓慢,该操作可能会花费一些时间,并且在Web dyno上进行操作可能会导致此操作被阻止接收其他请求。
但是,从我读到的内容来看,在我看来,Node.js的要点之一是,由于其基于事件的异步运行时模型,因此在这些条件下不会遭受阻塞。
我很困惑,因为这不意味着可以在Web dynos中(异步)进行API调用吗?也许是针对同步模型更为普遍的Ruby/Python/etc用例编写了更多文档?
最佳答案
NodeJS是reactor pattern的实现。 NodeJS的默认构建使用5个 react 堆。一旦将这5个 react 堆用于IO绑定(bind)任务,主事件循环就会阻塞。
关于NodeJS的一个常见误解是它是一个允许您一次执行许多操作的系统。不一定是这种情况,它允许您在等待IO绑定(bind)任务时做其他事情,一次最多5个。
任何与CPU绑定(bind)的任务总是在主事件循环中执行,这意味着它们将被阻塞。
这意味着,如果您的“工作”受IO约束,例如将其放入数据库中,则可能无需使用dynos就可以摆脱困境。当然,这取决于您计划一次执行多少项操作。请记住,您放置在主应用程序中的任何任务都会占用其他传入请求的资源。
通常,不建议您进行此类操作,如果您有一个执行某些处理的作业,则该作业属于在其自己的进程或线程中执行的队列。