Hello all,

I have a queue (I am using redis) with things pilling up.  Sometimes things 
gets pilled up real fast and sometimes real slow.

I have a ruby script that loops forever and empty the queue, one item at a 
time.

When there is less than 5000 in the queue, I want only one process.
When there is between 5000 and 9999 items in the queue, I want two process 
until the queue is down to 4000 or less.
When there is between 10000 and 14999 items in the queue, I want three 
process until the queue is down to 8000 or less.
and so on...

I want the number of processes to go up and down depending on how many 
things are in the queue.  Is it possible with god?  If not, is there an 
alternative or a way around?

Here is my god config file that was hoping to work but, I cannot use :stop 
in transition  (E [2012-09-06 14:00:18] ERROR: Invalid state :stop. Must be 
one of the symbols :init, :up, :start, :restart)

rails_env   = ENV['RAILS_ENV']  || "production"
rails_bin   = `which rails`.chomp
rails_root  = ENV['RAILS_ROOT'] || 
File.dirname(File.dirname(File.realdirpath(__FILE__)))

require File.expand_path('environment.rb', File.dirname(__FILE__))

num_process = 5
num_process.times do |num|
  God.watch do |w|
    w.name = "process_queued_track_hits-#{num}"
    # w.start = "#{rails_root}/script/process_queued_track_hits.sh 
${rails_env}"
    w.start = "exec #{rails_bin} runner -e '#{rails_env}' 
'Bonus.process_queued_track_hits'"
    w.env = {
      'RAILS_ROOT' => rails_root,
      'RAILS_ENV' => rails_env
    }
    w.dir = rails_root
    w.interval = 30.seconds

    # restart if memory gets too high
    w.transition(:up, :restart) do |on|
      on.condition(:memory_usage) do |c|
        c.above = 350.megabytes
        c.times = 2
      end
      on.condition(:cpu_usage) do |c|
        c.above = 50.percent
        c.times = 5
      end
      on.condition(:cpu_usage) do |c|
        c.above = 80.percent
        c.times = 2
      end
    end

    # determine the state on startup
    w.transition(:init, { true => :up, false => :start }) do |on|
      on.condition(:process_running) do |c|
        c.running = true
      end
    end

    # determine when process has finished starting
    w.transition([:start, :restart], :up) do |on|
      on.condition(:process_running) do |c|
        c.running = true
        c.interval = 5.seconds
      end

      # failsafe
      on.condition(:tries) do |c|
        c.times = 5
        c.transition = :start
        c.interval = 5.seconds
      end
    end

    # start if process is not running
    w.transition(:up, :start) do |on|
      on.condition(:process_running) do |c|
        c.running = false
      end
    end

    w.stop_if do |on|
      on.condition(:lambda) do |c|
        c.interval = 30.seconds
        c.lambda = lambda do
          $redis.llen("track_hits_queue") < num * 4000
        end
      end
    end

    w.transition([:stop, :init], :start) do |on|
      on.condition(:lambda) do |c|
        c.interval = 30.seconds
        c.lambda = lambda do
          $redis.llen("track_hits_queue") > num * 5000
        end
      end
    end

  end
end



If not possible, I can pass a parameter to  
Bonus.process_queued_track_hits(#{num 
* 5000}) so that all process always run and my loop check if its time to 
start emptying the queue or not.

Thanks.

-- 
You received this message because you are subscribed to the Google Groups 
"god.rb" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/god-rb/-/_3SBvaBPsWYJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/god-rb?hl=en.

Reply via email to