0

私はRufus Schedulerを使用して、1時間ごとに実行するバックグラウンドジョブを起動しています。Railsバックグラウンドジョブを2回実行する

scheduler = Rufus::Scheduler.singleton 

scheduler.every '1h' do 
JobName.perform_now 
end 

私はAWSで私のインフラ設定を行い、生産のために、ECS内にAPPを実行する2つのインスタンスがあります。

スケジューラがジョブを2回スケジューリングすることがあります。 00:05:00で01とインスタンスBスケジュール:00:05 00に

インスタンスAスケジュールジョブを05

ジョブが失敗していません。私はActiveJobを使用しています。遅延ジョブのような他の解決策を検討していましたが、複数のインスタンスがある場合は同じ問題があります。

あなたはこの問題を解決する別の方法を提供できますか?または同じ回避策ですか?

答えて

1

https://github.com/jmettraux/rufus-scheduler#lockfile--mylockfiletxt

「これは、スケジューラを保持しているRubyのプロセスを複数回開始される環境で役立ちます。」

はこれを試してみてください:ECSインスタンスはファイル、飼育係、領事とRedisのが最も一般的なものを共有していないので、

scheduler = Rufus::Scheduler.singleton(:lockfile => ".rufus-scheduler.lock") 

scheduler.every '1h' do 
JobName.perform_now 
end 
+0

ロックは文句を言わない私がドッキングウィンドウを持っていると私はECSコンテナ内で複数のインスタンスにそのドッキングウィンドウを展開しています –

1

あなたはdistributed lockを必要としています。飼育係との例以下は

from the docs:あなたでし多分 use EFS to share a lockfile

class ZookeptScheduler < Rufus::Scheduler 

    def initialize(zookeeper, opts={}) 
    @zk = zookeeper 
    super(opts) 
    end 

    def lock 
    @zk_locker = @zk.exclusive_locker('scheduler') 
    @zk_locker.lock # returns true if the lock was acquired, false else 
    end 

    def unlock 
    @zk_locker.unlock 
    end 

    def confirm_lock 
    return false if down? 
    @zk_locker.assert! 
    rescue ZK::Exceptions::LockAssertionFailedError => e 
    # we've lost the lock, shutdown (and return false to at least prevent 
    # this job from triggering 
    shutdown 
    false 
    end 
end 

が、これは正しい方法ではありません。

0

インスタンスAでのみスケジューラ

+0

何か良いを行うので、私はAWS 2つの類似のインスタンスを使用していますスタート –

関連する問題