views:

492

answers:

3

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
+1  A: 

I am using Beanstalk and have written my own daemons using the daemons gem. Daemon kit is a new project but queue loops are not yet implemented. You can also have a look at Nanite if it fits your needs, it's framework-agnostic.

Mihai A
+1  A: 

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.

Bob Aman
A: 

Check out nanite (written in Ruby), it's a young project written atop rabbitmq.

github.com/ezmobius/nanite/tree/master

Ahsan Ali
Piku beat ya to it. :-)
Bob Aman