【发布时间】:2014-10-02 15:10:11
【问题描述】:
我正在构建一个 Web 应用程序,它的核心功能是让用户能够上传大图像并对其进行处理。完成处理大约需要 3 分钟,我认为 Heroku 将是一个理想的平台,能够按需运行这些处理作业,并且以高度可扩展的方式。处理任务本身的计算成本相当高,并且需要运行高端 PX 测功机。我想最大化并行化,并最小化(有效地消除)作业在队列中等待的时间。换句话说,我希望 N PX dynos 用于 N 个工作。
谢天谢地,我可以使用 Heroku 的 API(或可选的 Hirefire 等服务)轻松完成此任务。每当有新的处理请求进来时,我可以简单地增加工作人员计数,新工作人员将从队列中获取作业并立即开始处理。
然而,虽然扩大规模是无痛的,但缩小规模是麻烦的开始。 Heroku API 令人沮丧地受到限制。我只能设置正在运行的工人的数量,而不是专门杀死空闲的工人。这意味着,如果我有 20 个工作人员,每个工作人员处理一个图像,并且一个人完成了它的任务,我不能安全地将工作人员数量扩展到 19,因为 Heroku 会杀死一个 任意 工作人员测功机,不管它是否真的在工作中!让所有工人运行直到所有工作完成是不可能的,因为成本将是天文数字。想象一下,在高峰期创建的 100 名工作人员继续无限期地闲置,因为全天都有一些新工作在不断涌现!
我搜索了网络,人们建议的最佳“解决方案”是让您的工作进程优雅地处理终止。好吧,如果您的工作人员只是在发送大量电子邮件,那很好,但我的工作人员正在对图像进行一些非常冗长的分析,正如我上面提到的,大约需要 3 分钟才能完成。
在理想的世界中,我可以在完成任务后杀死一个特定工人测功机。这将使缩小与放大一样容易。
事实上,通过从工人测功机切换到一次性测功机(它在进程终止时终止,即您在它的“根程序”退出后停止为测功机付费),我已经接近了那个理想的世界。但是,Heroku 设置了可以同时运行 5 个一次性 dyno 的硬性限制。这我可以理解,因为我肯定在某种意义上滥用了一次性测功机……但这仍然令人沮丧。
有什么方法可以更好地缩减我的员工人数?我宁愿不必从根本上重新设计我的处理算法......将它分成几块在 30-40 秒内运行而不是 3 分钟的时间(这样就不会意外杀死正在运行的工人灾难性的)。这种方法会极大地复杂化我的处理代码并引入几个新的故障点。但是,如果这是我唯一的选择,我将不得不这样做。
感谢任何想法或想法!
【问题讨论】:
-
afaik 你可以重新启动特定的测功机,例如discussion.heroku.com/t/stop-a-specific-dyno/424。事后立即改变阵型可能会奏效吗?您必须知道已完成运行的工作人员的姓名
-
@unohoo 听起来很有希望!我会试一试并报告。
-
@ColemanS 你有没有想过这里有什么?试图实现基本相同的目标。