Jeevan Dongre
Jeevan Dongre

Reputation: 4649

Rails Activemailer with RabbitMQ (ruby on rails)

I am running a Ruby on Rails application, presently using delayed_job to send emails. But I want to switch to RabbitMQ messaging queue. I am not able to find any useful resource to get started with it. I read many RabbitMQ docs and what not. Please get me some heads up to accomplish this task.

Upvotes: 0

Views: 1323

Answers (3)

thrice801
thrice801

Reputation: 1671

If you are looking to kill 2 birds with one stone, and your sending an email needs are based on active record lifecycle events (which they almost always are), you should check out my gem.

https://github.com/jasonayre/active_pubsub

It was built on the bunny gem and works much like active record observers, except you run the subscribers in a separate process. (this is actually just a bonus functionality, its intended largely to allow multiple rails apps to subscribe to each others events) -- I.E.

#user model
class User < ::ActiveRecord::Base
  include ::ActivePubsub::Publishable

  publish_as "myapp"
end

#subscriber

class PostSubscriber < ::ActivePubsub::Subscriber
  observes "cms"
  as "aggregator"

  on :created do |user_hash|
    user = User.find(user_hash[:id])
    #or whatever
    WelcomeMailer.deliver(user)
  end
end

== async delivery + keeps your controllers slimmer.

Upvotes: 1

rewritten
rewritten

Reputation: 16435

RabbitMQ integrations for Rails heavily depend on eventmachine and callback-based code. This will make your code really complex, and you will need to make all your code aware of the event loop.

For instance, you can't use the same code if you deploy behind thin (which already has a running event loop) or behind unicorn (in which you have to instantiate a reactor and manage its lifecycle).

On the other side, you can abstract this to an actual job queue (Resque is already much faster than DJ, Sidekiq smokes its pants off, and Beanstalkd/Stalker is a very good contender) which is probably going to be compatible to the Rails.queue abstraction in rails 4.

In Rails 4, you have also the option to configure all ActionMailer to be async by default (thereby delegating to any configured job queue). http://reefpoints.dockyard.com/ruby/2012/06/26/rails-4-sneak-peek-async-actionmailer.html

Upvotes: 1

Thomas Klemm
Thomas Klemm

Reputation: 10856

If you are looking for a great Ruby background jobs processing library to replace delayed_job you should give Sidekiq a try. There even is a recent Railscast about it here.

You can get an overview on Background Jobs Gems on Knight.io (I started this site).

Upvotes: 0

Related Questions