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

Posted

技术标签:

【中文标题】单个 Heroku 应用程序上的多个工作程序/Web 进程【英文标题】:multiple worker/web processes on a single heroku app 【发布时间】:2014-05-24 05:40:37 【问题描述】:

是否有某种方法可以配置多个工作程序和/或 Web 进程以在单个 Heroku 应用程序容器中运行?还是必须将其分解为多个 Heroku 应用程序?

例如:

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

【问题讨论】:

为了进一步澄清,当我尝试执行此操作时,所有 js 文件都已执行,但它们在工头下显示为同一个进程(例如 worker.1 和 web.1)。我有兴趣让它们在自己的测功机上运行,​​这样我就可以单独控制它们的缩放。 【参考方案1】:

所有进程都必须有唯一的名称。 此外,名称 webworker 无关紧要,没有特殊含义。 唯一具有重要名称的进程是 web 进程,如 Heroku 文档中所述: p>

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

【讨论】:

看来你是对的,worker没有特殊含义,但只有名为“web”的进程才会响应web请求。如果您更新答案,我会接受。这很有帮助。 在这个例子中,有没有办法将流量路由到“api”进程? 看起来我们必须有一个“网络”代理,将/api/* 请求流式传输到“api”工作程序,并将所有其他请求流式传输到“应用程序”工作程序。当这些工人有多个实例时,这可能会变得有点复杂;然后,您需要实施或 npm-install 负载均衡器。或者,您可以只运行多个 Heroku 应用程序,但现在存储库组织变得有点复杂(子模块?)。 Heroku 已经实现了负载均衡器。 Worker 在不影响 Web Worker 的单独 CPU 上运行,因此您可以使用 rabbitmq 并将工作发送给 worker,然后使用 Redis 之类的东西进行通信。如果您使用的是 nodejs,您还可以集群您的应用程序以利用更多 CPU,但要注意您的 RAM。 我之前做过这个测试,将使用 Procfile 中唯一名称的最后声明。例如,我尝试运行两个不同 php 文件的两个名为 worker 的测功机和一个 web 测功机。如果您要保持计数,那应该是 3 个测功机,但只有两个被激活。 worker dyno 正在运行第二个声明中的 PHP 脚本,但是当我将它们命名为 worker1worker2 时,我最终得到了我试图使用的所有 dyno。

以上是关于单个 Heroku 应用程序上的多个工作程序/Web 进程的主要内容,如果未能解决你的问题,请参考以下文章

Heroku + socket.io 广播上的多个测功机

是否可以跳过 Heroku 上的单个 git push 的资产预编译步骤?

Heroku 上的 NPM 私有 git 模块

我啥时候需要在 Heroku 中使用工作进程

单个进程 winform 应用程序上的多个应用程序域

最佳实践:单个 Amazon EC2 实例上的多个 django 应用程序