質問

ちょっとレールが初めてなので、私に対処してください。私が今やっているのは、いくつかのRubyコードを使用するResqueのバックグラウンド処理です。 Rescque Rakeタスクを開始するために、私は(Herokuで)使用しています。私は、Herokuの魔法の(または奇妙な)スレッドアーキテクチャに接続するための推奨コードを備えたResque.rakeファイルを持っています。

require "resque/tasks"
require 'resque_scheduler/tasks'

task "resque:setup" => :environment do
  ENV['QUEUE'] = '*'
end


desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"

Railsコードにアクセスする必要があるため、環境を参照します。 Herokuのバックグラウンドで少なくとも1人の労働者のDynoを設定した場合、私のリクは素晴らしく、クリアされ、すべてが幸せです。私が物を自動化しようとするまで...

そこで、コードを進化させ、毎分関連するタスクでキューを自動的に埋めたいと思いました。それを行います(Cronを使用せずに、HerokuはCronで適切ではないため)、Rufus Schedulerを使用してタスクを実行するTask_scheduler.rbという名前の初期化を宣言します。

scheduler = Rufus::Scheduler.start_new

scheduler.in '5s' do
  autoprocessor_method
end

scheduler.every '1m' do
  autoprocessor_method
end

物事はしばらくの間素晴らしいように見えます....その後、レーキプロセスは、説明できないほどのキューから拾うのを止めます。キューは大きくなり、大きくなります。複数のワーカーダイノを実行している場合でも、最終的には疲れてキューの処理を停止します。私が何を間違えているのかわかりませんが、私のレーキタスクでRails環境を参照することで、task_scheduler.rbコードが再び実行され、重複スケジューリングが発生していると思われます。誰かが知っている場合、その問題をどのように解決するのか疑問に思っています。それがレーキタスクが機能を停止する理由であるかどうかも興味があります。

ありがとうございました

役に立ちましたか?

解決

初期イザーでスケジューラを起動しないでください。スケジューラを実行してキューを埋めるデーモンプロセスが必要です。それはこのようなものです(「スクリプト/スケジューラ」):

#!/usr/bin/env ruby

root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
Dir.chdir(root)

require 'rubygems'
gem 'daemons'
require 'daemons'

options = {
    :dir_mode   => :normal,
    :dir        => File.join(root, 'log'),
    :log_output => true,
    :backtrace  => true,
    :multiple   => false
}

Daemons.run_proc("scheduler", options) do

  Dir.chdir(root)
  require(File.join(root, 'config', 'environment'))

  scheduler = Rufus::Scheduler.start_new

  scheduler.in '5s' do
    autoprocessor_method
  end

  scheduler.every '1m' do
    autoprocessor_method
  end

end

また、このスクリプトをアプリの通常のデーモンとして呼び出すことができます。

script/scheduler start

これは、あなただけがあることを確認するつもりです 1 実行しているモングレルごとに1つではなく、レストランワーカーの作業を送信します。

他のヒント

まず第一に、あなたがHerokuで走っていないなら、私はこのアプローチをお勧めしません。 Mauricioの答えを見たり、古典的なCronの仕事を使用したり、Cronジョブをスケジュールするときはいつでも使用することを検討します。

しかし、もしあなたがヘロクで走ってこれをしようとすることの痛みに陥っているなら、これがどのように機能したかを以下に示します。

元の質問で貼り付けたように、同じ元のresque.rakeコードを所定の位置に保持しました。さらに、ジョブに添付した別のレーキタスクを作成しました。最初のケースと同じように、作業レーキプロセス:

desc "Scheduler processor"
  task :scheduler => :environment do
  autoprocess_method
  scheduler = Rufus::Scheduler.start_new
  scheduler.every '1m' do
     twitter_autoprocess
  end
end

desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "scheduler"

いくつかのメモ:

  1. スケジューラが複数の場所で実行されるため、複数のワーカーDynoを使用すると、これは不完全になります。状態をどこかに保存することでそれを解決できますが、私が望むほどきれいではありません。
  2. プロセスが掛かる当初の理由を見つけました。それはこのコードの行でした:

    scheduler.in '5s' do
     autoprocessor_method
    end
    

    理由はわかりませんが、それを削除したとき、二度とぶら下がっていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top