Navvy adalah background job processor. Navvy dibuat oleh Jeff Kreeftmeijer yang diinspirasi oleh background job processor yang bernama delayed_job.

Perbedaan utama navvy dengan delayed_job adalah penggunaan database. Dalam setiap job yang ada, navvy menyimpannya ke dalam sebuah tabel create_jobs dibandingkan dengan delayed_job yang hanya tersimpan pada memori. Dengan begitu, background job dengan navvy bisa dipastikan tidak hilang jika terjadi mati lampu / blackout. Namun, hal ini juga mengakibatkan masalah di sisi performansi, yaitu karena melakukan akses terhadap database, waktu yang diperlukan lebih besar dibandingkan delayed_job. Berikut ini adalah tutorial dalam penggunaan navvy.

1. Setup

root@slacky:~# gem install navvy
aji@slacky:~/lab$ rails app_with_navvy
aji@slacky:~/lab$ cd app_with_navvy

2. Konfigurasi

# config/environment.rb
# ----- cut -----
Rails::Initializer.run do |config|
  config.gem 'navvy' # ----> add this line
# ----- cut -----
aji@slacky:~/lab/app_with_navvy$ touch config/initializers/navvy.rb
# config/initialiazers/navvy.rb
require 'navvy/job/active_record'
aji@slacky:~/lab/app_with_navvy$ ./script/generate navvy
aji@slacky:~/lab/app_with_navvy$ rake db:migrate
# Rakefile
require(File.join(File.dirname(__FILE__), 'config', 'boot'))

require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'

require 'tasks/rails'
require 'navvy/tasks' # ---> add this line

3. Buat Resource

aji@slacky:~/lab/app_with_navvy$ ./script/generate scaffold post title:string content:text name:string
aji@slacky:~/lab/app_with_navvy$ rake db:migrate
aji@slacky:~/lab/app_with_navvy$ touch lib/auto_post.rb

4. Buat Script Untuk Dijalankan Oleh Navvy

# lib/auto_post.rb
class AutoPost
  def self.auto_create
    puts "creating post..."
    Post.create(:title => "my title", :content => "my content", :name => "my name")
  end
end
# config/initializers/navvy.rb
require 'navvy/job/active_record'

Navvy::Job.enqueue(AutoPost, :auto_create) # ---> add this line

5. Jalankan Navvy worker

aji@slacky:~/lab/app_with_navvy$ rake navvy:work
(in /home/aji/lab/app_with_navvy)
*** Starting ***
creating post...
* AutoPost.auto_create() => #<post:0xb755f070>
creating post...
* AutoPost.auto_create() => #<post:0xb751f77c>
creating post...
* AutoPost.auto_create() => #<post:0xb74d3b4c>

Selesai.. :)

Update

Navvy dan delayed_job sama-sama menggunakan database dalam melakukan background job processing, perbedaannya adalah delayed_job hanya dapat digunakan pada ORM ActiveRecord, sedangkan navvy dapat digunakan oleh ORM selain ActiveRecord. Oleh karena sama-sama menggunakan database, secara teori Navvy performansinya setara dengan delayed_job. Thanks to Jeff Kreeftmeijer for the correction.