Background processing

21
Background Processing Kerry Buckley IPRUG 3 November 2010

Transcript of Background processing

Page 1: Background processing

Background Processing

Kerry BuckleyIPRUG 3 November 2010

Page 2: Background processing

Why?

• Sending e-mail, SMS, tweets etc

• Resizing images

• Generating large PDFs

• Updating search indexes

• etc

Page 3: Background processing

Approaches• Process/thread based

• Spawn

• Database-backed• BackgroundDRb, BackgroundJob,

DelayedJob, JobFu, Background-Fu

• Queue-backed• Sparrow, Starling, Kestrel, RabbitMQ,

ActiveMQ, SQS, Beanstalkd, Resque

Page 4: Background processing
Page 5: Background processing

Delayed::Job

Page 6: Background processing

Delayed::Job

• Extracted from Shopify

• Daemon runs with Rails environment

• Use collectiveidea’s fork

• 2.0 for Rails 2.x

• 2.1RC (from GitHub) for Rails 3

• ActiveRecord/MongoMapper/DataMapper

Page 7: Background processing

SetupGemfile:gem "delayed_job", :git => "git://github.com/collectiveidea/delayed_job.git"

Then run:$ rails g delayed_job

$ rake db:migrate

$ script/delayed_job start

Page 8: Background processing

Delaying methods

Mailer.send_alerts(event)

Page 9: Background processing

Delaying methods

Mailer.delay.send_alerts(event)

Page 10: Background processing

Options

Mailer.delay(:priority => 3, run_at => 1.hour.from_now). send_alerts(event)

Page 11: Background processing

Running workers

Foreground$ rake jobs:work

$ script/delayed_job run

Daemonised$ script/delayed_job start

$ RAILS_ENV=production script/delayed_job -n 4 start

Page 12: Background processing

Custom Jobs

class NewsletterJob < Struct.new(:text, :emails) def perform emails.each do |e| NewsletterMailer.deliver_text_to_email(text, e) end endend

emails = Customers.all.collect(&:email)Delayed::Job.enqueue NewsletterJob.new(text, emails)

Page 13: Background processing

Hooksdef enqueue(job)end

def before(job)end

def after(job)end

def success(job)end

def error(job, exception)end

def failureend

Page 14: Background processing

Resque

Page 15: Background processing

Resque

• Created by GitHub

• Jobs persisted to Redis as JSON

• Multiple queues

• Parent/child forking architecture

• Web monitoring interface

Page 16: Background processing

SetupRedis:

$ brew install redis

Gemfile:

gem "resque"

Rakefile:

require "resque/tasks"task "resque:setup" => :environment

Page 17: Background processing

Delaying methods

class Archive @queue = :file_serve

def self.perform(repo_id, branch = 'master') repo = Repository.find(repo_id) repo.create_archive(branch) endend

Resque.enqueue(Archive, repository.id, branch)

Page 18: Background processing

Running queues

$ QUEUE=queue_name rake resque:work

$ QUEUES=file_serve,warm_cache rake resque:work

$ QUEUES=critical,high,low rake resque:work

$ QUEUE=* rake resque:work

$ COUNT=5 QUEUE=* rake resque:workers

Page 19: Background processing

Monitoring$ resque-web

Page 20: Background processing

Which to use?

Delayed::Job Resque

How much of your site is background work?

Less than 50% More than 50%

Page 21: Background processing

Demo