Skip to content

samuelgiles/lazy_resque

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lazyresque

Lazy Resque

Move Resque enqueues out of the Rails request cycle to help decrease time to first byte.

Install

From gem:

gem 'lazy_resque'

From source:

gem 'lazy_resque', git: 'git@github.com:samuelgiles/lazy_resque.git'

Use

Trigger the actual enqueue of the jobs after the request in an after_action block, this can be done by including LazyResque::ControllerEnqueue which will automatically add the after_action for you.

class ApplicationController < ActionController::Base
  include LazyResque::ControllerEnqueue

  def index
    Resque.lazy_enqueue(MyResqueJob, 1234, 'some_job_data')
  end
end

Why?

Though moving a long running task to a Resque job is beneficial the actual enqueuing process isn't free:

  • Any before_enqueue hooks are run
  • A new job instance is initialized and validated
  • Arguments are dumped/encoded into JSON
  • Redis rpush takes places requiring communication with the Redis server

This is fine for 1-2 enqueues in a request cycle but can add up to a measurable amount of time if your enqueuing several jobs.

You don't lose anything by moving the actual enqueuing outside the request cycle and it saves precious milliseconds.

How?

yodawg

Internally when you call Resque.lazy_enqueue the job class and arguments are stored in an array on a per request thread variable, then at the end of the request via the after_action callback the queue is looped through and the jobs are actually sent to Resque.

About

Move Resque enqueues out of the Rails request cycle to help decrease time to first byte.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published