레일즈 4.2에서는 백그라운드 작업을 실행하는 표준 API로 액티브잡(Active Job)을 도입했다. 액티브잡 도입 이전에는 채택하는 백엔드 큐잉 프레임웍별로 상이한 코드를 사용했었으나 이제는 액티브잡이 이러한 차이를 흡수함에 따라 백엔드 프레임웍과 상관없는 공통 코드를 사용할 수 있게 되었다.
잡 (Job) 생성
bin/rails g job demo_worker
vi app/jobs/demo_worker_job.rb

class DemoWorkerJob < ActiveJob::Base
  queue_as :default

  def perform(*args)
   sleep(2) # long-running task
  end
end
레일즈 콘트롤러에서 잡(Job) 호출
vi Controller.rb

def create
  DemoWorkerJob.perform_later()
  render json: 'Finished', status: :ok
end
현재는 백엔드 큐잉 시스템을 지정하지 않은 상태이기 때문에 큐 사용없이 바로 잡(job)이 호출된다. 따라서 위 코드는 2초 후에 json 응답이 발생한다.
사이트킥(Sidekiq) 백엔드 어댑터
Sidekiq 설치 vi Gemfile; bin/bundle install
gem 'sidekiq'
액티브잡 백엔드 어댑터 설정 vi config/application.rb
config.active_job.queue_adapter = :sidekiq
사이드킥 실행 bin/bundle exec sidekiq
써커 펀치(Sucker Punch) 백엔드 어댑터
써커 펀치(Sucker Punch) 설치 vi Gemfile; bin/bundle install
gem 'sucker_punch'
액티브잡 백엔드 어댑터 설정 vi config/application.rb
config.active_job.queue_adapter = :sucker_punch
백엔드 큐잉 프레임웍 비교
Delayed job vs Resque
  • Delayed job은 데이터베이스를, Resque는 레디스(Redis)를 큐(Queue)로 사용
  • Delayed job은 모든 워커(worker)에서 레일즈 환경을 로드하고, Resque는 필요시에만 로드
  • Delayed job은 레일즈 어플리케이션과 같은 프로세스 내에서 실행되고, Resque는 별도의 프로세스에서 실행됨
Resque vs Sidekiq
  • 둘 다 레디스(Redis)를 큐로 사용
  • Sidekiq은 쓰레드(thread) 방식이고, Resque는 포크(fork)된 프로세스
  • 리소스 절감 측면에서 Sidekiq이 유리하나 그대신 모든 코드(사용 젬 포함)를 Thread-safe 하게 작성해야 함
Sidekiq vs Sucker Punch
  • 둘 다 쓰레드 방식으로 동작
  • 써커 펀치는 메모리를 큐로 사용하므로 사전에 별도로 실행해야 할 도구가 없음
  • 써커 펀치는 배포 또는 머신을 재시동하는 경우 큐의 손실이 발생
  • 써커 펀치는 순수 루비로만 작성