我的环境是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分钟才能完成。在此期间,不太重要的背景任务需要继续,可能有一名工作人员专门为他们服务。
因此,我将该优先级任务块设置为在命名队列中,例如'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生产环境中?
答案 0 :(得分:14)
在延迟工作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
等
答案 1 :(得分:1)
关于HireFire的原始问题也是如此。此时,HireFire不支持命名队列(see HireFire website),这使得自动缩放变得困难。