psharma
psharma

Reputation: 1289

Delay sending mails to boost page load time

In my Product#create method I have something like

ProductNotificationMailer.notify_product(n.email).deliver

Which fires off if the product gets saved. Now thing is before the above gets fired off, there are bunch of logics and calculations happening which delays the confirmation page load time. Is there a way to make sure the next page loads first and the mail delivery can happen later or in the background?

Thanks

Upvotes: 2

Views: 72

Answers (2)

Jason L Perry
Jason L Perry

Reputation: 1255

Yes, you'll want to look into background workers. Sidekiq, DelayedJob or Resque are some popular ones.

Here's a great RailsCast demonstrating Sidekiq.

class NotificationWorker
  include Sidekiq::Worker

  def perform(n_id)
    n = N.find(n_id)
    ProductNotificationMailer.notify_product(n.email).deliver 
  end
end

I'm not sure what n was in your example, so I just went with it. Now where you do the work, you can replace it with:

NotificationWorker.perform_async(n.id)

The reason you don't pass full object n as an argument, is because the arguments will be serialized, and it's easier/faster to serialize just the integer id.

Once the jobs is stored, you have a second process running in the background that will do the work, freeing up your web process to immediately go back to rendering the response.

Upvotes: 2

Squadrons
Squadrons

Reputation: 2557

Delayed jobs will do this:

Here is the github page.

and here is a railscast on setting it up.

Upvotes: 1

Related Questions