在Heroku Rails应用程序上动态扩展Dyno工作者大小

时间:2016-08-02 15:49:56

标签: ruby-on-rails ruby heroku heroku-api

我正在开发一个项目,它通过一个资源非常密集的Rails工作者启动一个进程,它只能由Heroku上的Performance Worker正确处理,1X工作人员因为使用太多内存和2X工作人员而被杀死勉强处理超过RAM限制的负载高达160%。绩效工作者可以毫无问题地完成工作。

我的问题是,有没有办法在作业启动之前动态地将Dyno大小切换到Performance,然后在作业完成或队列为空后将其缩小?

我知道HireFire存在,但据我所知,这项服务只会增加基于队列长度等的工作人员数量?我想到的另一个可能的解决方案是使用Heroku API,它具有一个Dyno端点,可以在作业开始之前调整工作器dyno的大小,然后在作业结束时将其重新调整大小。

是否有其他人对此问题有其他建议,想法或策略?

谢谢!

2 个答案:

答案 0 :(得分:1)

最好的方法是你提到的那个:在开始工作之前使用Heroku Platform API缩放你的Dyno尺寸,然后再用下来。

这是因为像HireFire这样的工具只能通过检查应用程序响应时间,路由器队列等内容来工作 - 所以他们无法知道你将要运行一些工作,然后只是为此扩展。

答案 1 :(得分:1)

根据用法的具体情况,您可以在proc文件中创建一个独特的dyno-type,它只运行这个特定的worker,并且总是缩放到public function store(AdminPartnerRequest $request) { return $this->handleCreateOrUpdate($request); } public function update(AdminPartnerRequest $request, $id) { return $this->handleCreateOrUpdate($request,true, $id); } private function handleCreateOrUpdate($request, $edit = false, $id = null) { if ($edit){ $partner = Partner::find($id); } else{ $partner = new Partner(); } $partner->name = $request->input('name'); $partner->picture = $request->input('image'); $partner->save(); return \Redirect::route('admin.partners.index'); } ,但并不总是在运行?您甚至可以通过一次性运行来运行它,而不是潜在地进行扩展(这也可以通过API完成,大致相当于performance)。也就是说,@ rdegges的答案肯定有用。