Search code examples
rubybackgroundworkeramqpdaemons

What's the best option for a framework-agnostic Ruby background worker library?


I'm building a simple recipe search engine with Ruby and Sinatra for an iPhone app, using RabbitMQ for my message queue. I'm looking around and finding a lot of different implementation choices for background processes, but most of them either implement custom message queue algorithms or operate as Rails plugins.

What's out there in terms of high-quality framework-agnostic worker libraries that will play nicely with RabbitMQ?

And are there any best-practices I should keep in mind while writing the worker code, beyond the obvious:

# BAD, don't do this!
begin
  # work
rescue Exception
end

Solution

  • I ended up writing my own library in a fit of uncontrollable yak-shaving. Daemon kit was the right general idea, but seriously way too heavyweight for my needs. I don't want what looks like a full rails app for each of my daemons. I'm going to end up with at least 3 daemons, and that would be a colossal mess of directories. The daemons gem has a horrible API, and while I was tempted to abstract it away, I realized it was probably easier to just manage the fork myself, so that's what I did.

    API looks like this:

    require "rubygems"
    require "chaingang"
    
    class Worker
      def setup
        # Set up connections here
      end
    
      def teardown
        # Tear down connections here
      end
    
      def call
        # Do some work
        sleep 1
      end
    end
    ChainGang.prepare(Worker.new)
    

    And then you just use the included rake task to start/stop/restart or check status. I took a page from the Rack playbook: anything that implements the call method is fair game as an argument to ChainGang.prepare and ChainGang.work methods, so a Proc is a valid worker object.

    Took me longer to build than it would've to use something else, but I have a vague suspicion that it'll pay off in the long-run.