Jumat, 11 September 2015

Active Job di Ruby on Rails

Kali ini kita akan bersama-sama belajar mengenal Active Job di Ruby on Rails. Kita akan mempelajari pengertiannya, manfaatnya dan contoh penggunaannya.

Active Job adalah sebuah framework, digunakan untuk mendlekarasikan sebuah pekerjaan yang nantinya akan dijalankan dala sebuah urutan di backend. Pekerjaan yang dimaksud disini bisa pekerjaan apa saja, mulai dari pembersihan data, pengurutan data, mailing dan pekerjaan lainnya yang bisa dikerjakan secara pararel.

Secara umum manfaat penggunaan Active Job adalah sebagai wrapper background job processing sehingga memudahkan developer untuk menuliskan code secara general. Active job menerjemahkan syntax yang ditulis developer agar bisa dibaca background engine yang digunakan. Terdapat tiga kondisi yang biasanya dibutuhkan sebuah active job:
  1. Sebuah proses yang membutuhkan External API untuk melakukan proses.
  2. Sebuah proses yang memerlukan banyak perhitungan atau proses (contohnya memproses sebuah gambar).
  3. Mengirimkaan email atau posting ke media lain (social media, blog dll).
Namun dalam prakteknya active job belum bisa berjalan sendiri, diperlukan library backend agar bisa menjalankannya. Rails 4 sudah menyediakan beberapa adapter untuk backend tersebut, namun kita masih harus menginstal gem dari backend yang akan kita pakai. List adapter yang bisa kita gunakan di rails bisa klik link ini.

Agar semakin paham, kita akan langsung mencoba menerapkannya dalam sebuah aplikasi sederhana. Kita akan mencoba menghapus beberapa data sekaligus melalui active job dengan adapter Sidekiq.

Buat aplikasi sederhana
Pertama siapkan sebuah aplikasi sederhana dengan dua model yaitu model User dan model Article dimana user has many articles. Kemudian isikan beberapa data di dalamnya. Anda bisa memanfaatkan aplikasi yang sudah pernah kita buat di belajar bareng kita sebelumnya (kalau ketinggalan bisa klik di sini)

Install sidekiq
Setelah aplikasi sederhana sudah berjalan selanjutnya kita install dulu sidekiq di aplikasi kita, caranya dengan memasukan gem sidekiq ke dalam gemlist.

gem 'sidekiq', '3.2.5'

Lalu lakukan bundle install.
Setelah itu kita akan membuat config file untuk sidekiq. Buat sebuah file di path config dengan nama sidekiq.yml

config/sidekiq.yml

:concurrency: 25
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
  - default

Untuk mengecek apakah sidekiq sudah terinstall dengan benar, jalankan server ( $ rails s) kemudian buka tab baru dari path tersebut. 
jalankan perintah:

sidekiq -C config/sidekiq.yml

Kalo tidak ada masalah seharusnya kurang lebih tampilannya akan seperti ini:

Jadi sekarang kita seolah-olah menjalankan dua server, satu untuk server rails dan yang satu untuk sidekiq. Biarkan keduanya berjalan namun bila ingin menghentikannya tinggal menekan kombinasi tombol Ctrl + C

Membuat active job
Sekarang kita akan memulai untuk membuat file active job dan melakukan beberapa penyesuaian agar bisa menjalankan active job dengan adapter sidekiq.
Pertama kita buat dulu file active job, caranya dengan mengetikan perintah ini di terminal:
rails generate job articles_cleanup

Secara otomatis akan terbentuk sebuah path baru di dalam app yaitu path jobs dan sudah ada satu file didalamnya dengan nama articles_cleanup_job.rb, kemudian kita isi file tersebut dengan code yang kurang lebih seperti ini:

app/jobs/articles_cleanup_job.rb
class ArticlesCleanupJob < ActiveJob::Base
  queue_as :default

  def perform(user_id)
    user = User.find(user_id)
    count = 0
    if user
      puts "Prepare to Delete article form user #{user.name}"
      articles = user.articles
      if articles
        articles.each do |article|
         
count += 1 if article.destroy
        end   
      end
    puts "Delete article finished, deleted articles = #{count}"
      end   
  end
end

Keterangan:
Agar nanti kita bisa tahu sidekiq kita telah benar-benar mengeksekusi proses delete article, kita tambahkan puts "Prepare to Delete article form user #{user.name}"  di awal proses dan puts "Delete article finished, deleted articles = #{count}" setelah proses selesai

Kemudian kita buat juga sebuah file di path config/initializers dengan nama active_job.rb lalu kita isi dengan code:

config/initiaizers/active_job.rb
ActiveJob::Base.queue_adapter = :sidekiq

Memanfaatkan active job di aplikasi
Pembuatan file active_job dan setup sidekiq sudah selesai, sekarang saatnya mencobanya pada aplikasi.
Saya akan memanfaatkan aplikasi yang sebelumnya dibuat pada sesi sebelumnya (klik di sini bila ingin membaca sesi sebelumnya), tinggal tambahkan sebuah model Article (isinya bebas) yang ber-relasi dengan model User, dimana user has_many articles.

Buat juga sebuah articles_controller dan sebuah method di controller tadi yang nanti berfungsi untuk memanggil active job tadi.


articles_controller.rb
class ArticlesController < ApplicationController
  def delete_articles
      ArticlesCleanupJob.perform_later(params[:id])
      redirect_to root_url
  end
end
 
Jangan lupa untuk mendaftarkan path-nya di routes.rb

routes.rb

resources :articles do
  member do
    get 'delete_articles'
  end

end

Pada view/home/index.html.erb juga kita ubah sedikit untuk memanggil method delete_articles tadi

view/home/index.html.erb
<%if current_user %>
  Conglartulation, you login with facebook
  </br>
  <%= link_to "Delete All articles this user"

      , delete_articles_article_path(current_user.id)%>
<%else%>
  <%= link_to "Login with facebook", "auth/facebook"%>

<%end%>

Sekarang kita akan mencobanya, tapi sebelumnya kita isi dulu tabel article dengan beberapa dummy data, bisa diisi secara random namun yang perlu diingat user_id harus terisi dengan id user yang sudah ada.

Berikut tampilan sesudah login




 Kemudian kita klik "Delete All articles this user". lalu cek di server aplikasi kita

Dari situ akan terlihat sebuah baris log:
[ActiveJob] Enqueued ArticlesCleanupJob (Job ID: 3f3571e7-81d7-48b6-a4a3-55ca7bc6dfaf) to Sidekiq(default) with arguments: "2"


Yang berarti active job kita sudah dijalankan dengan memanfaatkan sidekiq. Bisa kita buktikan dengan melihat server sidekiq

 Yup, penanda awal proses dan setelah proses sudah tertulis, berarti sidekiq telah menjalankan proses penghapusan Articles untuk user tersebut.

Demikianlah pengenalan active_job pada rails 4 secara sederhana ini. Sebenarnya pembelajaran mengenai active joba baik teknik, maupun pemanfaatannya masih sangat luas sekali, dan mungkin akan kita pelajari bersama lain waktu.
Semoga belajar bareng kali ini bermanfaat dan Happy Coding (^.^)


Sumber:
- Active Job Basics 
- How to Integrate Sidekiq With ActiveJob
- Gem Sidekiq

Tidak ada komentar:

Posting Komentar