如何将工作人员分成延迟工作+ heroku的工作池?

我的环境是rails 3.1,heroku bamboo stack,delayed_job_active_record,(https://github.com/collectiveidea/delayed_job)并尝试使用hirefire。 (https://github.com/meskyanichi/hirefire) – 我可以看到delayed_job队列文档,但是如何在heroku上应用它?

我有一组最高优先级的任务,每小时就会产生一次,我需要投入3名工作人员,大约需要26分钟才能完成。 在此期间,不太重要的后台任务需要继续,可能有1名工作人员专门为他们服务。

因此,我将优先级任务块设置为命名队列,例如’hourtask’,然后为其他所有内容命名一个队列’everythingelse’:)

问题是,我如何将heroku工作者专门用于特定队列? 根据文档,它与环境变量有关吗? 它说:

# Set the --queue or --queues option to work from a particular queue. $ RAILS_ENV=production script/delayed_job --queue=tracking start $ RAILS_ENV=production script/delayed_job --queues=mailers,tasks start 

但是我对heroku设置不熟悉,想知道如何将它应用到我的heroku生产环境中?

它位于延迟工作3的自述文件中:

DJ 3引入了Resque风格的命名队列,同时仍然保留了DJ风格的优先级。 目标是提供一个系统,用于对由不同工作池进行工作的任务进行分组,这些工作池可以单独进行缩放和控制。

可以通过设置队列选项将作业分配到队列:

 object.delay(:queue => 'tracking').method Delayed::Job.enqueue job, :queue => 'tracking' handle_asynchronously :tweet_later, :queue => 'tweets' 

script / delayed_job可用于管理将开始处理作业的后台进程。

为此,请将gem“守护进程”添加到Gemfile中,并确保运行rails generate delayed_job

然后,您可以执行以下操作:

 $ RAILS_ENV=production script/delayed_job start $ RAILS_ENV=production script/delayed_job stop # Runs two workers in separate processes. $ RAILS_ENV=production script/delayed_job -n 2 start $ RAILS_ENV=production script/delayed_job stop # Set the --queue or --queues option to work from a particular queue. $ RAILS_ENV=production script/delayed_job --queue=tracking start $ RAILS_ENV=production script/delayed_job --queues=mailers,tasks start 

通过设置QUEUE或QUEUES环境变量来处理队列。

 QUEUE=tracking rake jobs:work QUEUES=mailers,tasks rake jobs:work 

在Heroku上,在proc文件中,创建两个条目:

 worker1: QUEUE=tracking rake jobs:work worker2: QUEUES=mailers,tasks rake jobs:work 

并逐个扩展:

 heroku ps:scale worker1=2 worker2=1 

等等

关于HireFire的原始问题也是如此。 目前,HireFire不支持命名队列(请参阅HireFire网站) ,这使得自动缩放变得困难。