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