在单个Heroku应用程序上使用多个工作进程/ Web进程

44

是否有办法在单个Heroku应用程序容器中配置多个工作进程和/或Web进程?还是必须将其拆分为多个Heroku应用程序?

例如:

worker: node capture.js
worker: node process.js
worker: node purge.js
web: node api.js
web: node web.js

进一步澄清一下,当我尝试这样做时,所有的js文件都会被执行,但它们在foreman下显示为同一个进程(例如worker.1和web.1)。我希望它们能够在自己的dynos上运行,这样我就可以单独控制它们的扩展。 - tobius
1个回答

60

所有进程必须具有唯一的名称。此外,webworker 这两个名称没有特殊含义和意义。

唯一一个带有重要名称的进程是 web 进程,正如 Heroku 文档所述:

web 进程类型很特殊,因为它是唯一一个从 Heroku 路由器接收 HTTP 流量的进程类型。其他进程类型可以任意命名。-- (https://devcenter.heroku.com/articles/procfile)

因此,您需要像这样的 Procfile

capture: node capture.js
process: node process.js
purge: node purge.js
api: node api.js
web: node web.js

您可以单独对每个进程进行缩放:

$ heroku ps:scale purge=4

1
看起来你是对的,worker 没有特殊的含义,只有名为“web”的进程会响应 web 请求。如果你更新你的答案,我会接受的。这非常有帮助。 - tobius
32
在这个例子中,有没有一种方法可以将流量路由到“api”进程? - joerick
2
看起来我们需要一个“web”代理,将/api/*请求流式传输到“api”工作进程,并将所有其他请求流式传输到“app”工作进程。当有多个这些工作进程的实例时,这可能会变得有点复杂;然后您需要实现或npm-install负载均衡器。或者,您可以运行多个Heroku应用程序,但现在存储库组织变得有点复杂(子模块?)。 - Dan Ross
1
Heroku已经实现了负载均衡器。工作进程运行在独立的CPU上,不会影响Web工作进程,因此您可以使用RabbitMQ等工具将工作发送到工作进程,然后使用类似Redis的工具进行通信。如果您正在使用Node.js,还可以对应用程序进行集群处理,以利用更多的CPU,但要注意RAM。 - droid-zilla
1
我之前已经完成了这个测试,Procfile中唯一名称的最后一个声明将被使用。例如,我尝试运行两个名称为worker的dyno,它们各自使用不同的PHP文件,并且一个单独的web dyno。如果你数一下,应该有3个dyno,但只有两个被激活了。worker dyno正在运行第二个声明中的PHP脚本,但当我将它们命名为worker1worker2时,我成功地启动了所有我想使用的dyno。 - Chris Rutherfurd
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接