我正在开发一个项目,它通过一个资源非常密集的Rails工作者启动一个进程,它只能由Heroku上的Performance Worker正确处理,1X工作人员因为使用太多内存和2X工作人员而被杀死勉强处理超过RAM限制的负载高达160%。绩效工作者可以毫无问题地完成工作。
我的问题是,有没有办法在作业启动之前动态地将Dyno大小切换到Performance,然后在作业完成或队列为空后将其缩小?
我知道HireFire存在,但据我所知,这项服务只会增加基于队列长度等的工作人员数量?我想到的另一个可能的解决方案是使用Heroku API,它具有一个Dyno端点,可以在作业开始之前调整工作器dyno的大小,然后在作业结束时将其重新调整大小。
是否有其他人对此问题有其他建议,想法或策略?
谢谢!
答案 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的答案肯定有用。