实时在Heroku上自动缩放Resque工作人员



我想根据挂起列表的大小自动放大/缩小dynos。

我听说过HireFire,但缩放只是每分钟一次,我需要它(几乎)是实时的。

我想缩放我的dynos,以便挂起的列表总是空的。

我在考虑自己做这件事(使用调度器(延迟约15s)并使用Heroku API),因为我不确定有什么东西;如果没有,你知道有什么监控工具可以在队列长度超过固定大小时发送电子邮件警报吗?(类似于新遗迹上的apdex)。

下面包含了一个潜在的自定义代码解决方案。也有两个新遗迹plgins做雷斯奎监测。我不确定他们是否会根据超过一定的队列大小发出电子邮件警报。使用resque挂钩,您可以通过Papertrail或Loggly等服务输出可能触发电子邮件警报(或slack、hipchat、pagerduty等)的日志消息。这可能看起来像:

def after_enqueue_pending_check(*args)
  job_count = Resque.info[:pending].to_i
  if job_count > PENDING_THRESHOLD
    Rails.logger.warn('pending queue threshold exceeded')
  end
end 

你可以发送一封电子邮件,而不是登录,但如果挂起的队列快速增长,你很容易就会被淹没。

我不认为有Heroku插件或其他服务可以实时进行扩展。有一个gem将使用不推荐使用的Heroku API来实现这一点。您可以使用resque钩子和Heroku平台api来实现这一点。这个未经测试的示例使用heroku平台api来上下缩放"worker"dynos。举个例子,我为每三个待处理的工作包括一个工人。只有在没有挂起的作业和正在工作的作业的情况下,降级才会每次将工人重置为1。这并不理想,应该根据您的需要进行更新。请参阅此处,了解有关确保缩减员工规模不会失业的信息:http://quickleft.com/blog/heroku-s-cedar-stack-will-kill-your-resque-workers

require 'platform-api'
def after_enqueue_upscale(*args)
  heroku = PlatformAPI.connect_oauth('OAUTH_TOKEN')
  worker_count = heroku.formation.info('app-name','worker')["quantity"]
  job_count = Resque.info[:pending].to_i
  # one worker for every 3 jobs (minimum of 1)
  new_worker_count = ((job_count / 3) + 1).to_i
  return if new_worker_count <= worker_count
  heroku.formation.update('app-name', 'worker', {"quantity" => new_worker_count})
end
def after_perform_downscale
  heroku = PlatformAPI.connect_oauth('OAUTH_TOKEN')
  if Resque.info[:pending].to_i == 0 && Resque.info[:working].to_i == 0
      heroku.formation.update('app-name', 'worker', {"quantity" => 1})
  end
end

我遇到了类似的问题,遇到了"Hirefire"

https://www.hirefire.io/.

对于ruby,请使用:

https://github.com/hirefire/hirefire-resource

它运行类似于AdepScale这样的理论作品(https://www.adeptscale.com/)。然而,Hirefire也可以扩大员工规模,并不仅仅局限于dynos。希望这能有所帮助!

最新更新