0

SidekiqまたはResqueキューが移動していないときに通知を受信する簡単な方法はありますか?

ワーカーがランダムに死亡し、キューが静止してしまうという問題が発生しています。死にゆく労働者の問題の解決に取り組んでいる間、私たちは行き詰まった仕事に対するサポートの呼びかけを先取りしたいと思っています。

4

2 に答える 2

0

ワーカーを定期的にチェックして、最後にいつ実行されたかを確認するモジュールを作成しました。

killStaleWorkers() を呼び出す Cron ジョブを作成しました。基本的に、redis キューをチェックして、現在のワーカーが実行を開始した時刻を確認します。私の場合、ジョブが 2 分以上前に実行された場合、それは古いジョブであり、おそらくフリーズしたことを意味します。その場合は、sidekiq を再起動するなど、いくつかのことを実行できます (私は実行しました)。ジョブに通常かかる時間に応じて、任意の時間を渡すことができます。

これが私のコードです。

class SidekiqDoctor
    def percentageStale(workers, staleTime, redis)
        stale = 0

        workers.each do |worker|
            key = "worker:" + worker + ":started"
            timeStarted = Time.parse(redis.get(key))

            if(timeStarted == nil)
                timeStarted = Time.now
            end

            puts "Key: " + key + ", Time started: " + timeStarted.to_f.to_s + ", Stale Time: " + staleTime.to_f.to_s

            if(timeStarted.to_f <= staleTime.to_f)
                stale = stale + 1
            end
        end

        percentage = (stale.to_f / workers.size.to_f) * 100

        return percentage
    end

    def killStaleWorkers(staleTimeAgo = 2.minutes, redis = Sidekiq.redis { |x| x })
        workers = redis.smembers("workers")
        currentMachine = Socket.gethostname
        existingWorkers = {} #key is PID, value is array of workers

        workers.each do |worker|
            tokens = worker.split(":")
            machine = tokens[0]
            pid = tokens[1].split("-")[0]

            puts "Machine: " + machine + ", PID: " + pid
            if(machine == currentMachine)
                begin
                    Process.getpgid( pid .to_i)
                    if(existingWorkers[pid] == nil)
                        existingWorkers[pid] = []
                    end

                      existingWorkers[pid] << worker

                rescue Errno::ESRCH
                    #pid doesn't exist
                    redis.srem("workers", worker)
                    puts "PID doesn't exist: " + pid
                end
            end  
        end

        pids = existingWorkers.keys
        staleTime = Time.now - staleTimeAgo

        puts "Stale time: " + staleTime.to_s
        restarted = false
        percentStale = 0

        for pid in pids
            puts "Testing PID: " + pid.to_s
            percentStale = percentageStale(existingWorkers[pid], staleTime, redis)

            puts "Stale Time %: " + percentStale.to_s
            #restart Sidekiq by touching restart.txt, which forces God to restart it
            if(percentStale >= 25)
                restartGod
                restarted = true
            end
        end

        return [restarted, percentStale]
    end



end
于 2013-02-11T19:32:25.013 に答える
0

動きの遅いキューや静止したキューを監視する既存のツールはありませんでした。そこで、いくつかの Sidekiq ミドルウェアを追加し、キューが古くなり始めたときに Campfire にメッセージを送信するタスクを提供する小さな gem を作成しました。

https://github.com/mpowered/sidekiq-nag

于 2013-02-12T06:20:24.360 に答える