Background Jobs ด้วย Active Job ของ Rails

background job

โดย แสงเดือน จันทร์ใหม่ – 3 สิงหาคม 2558


Background Jobs คืออะไร

Background Jobs คือการทำงานของ process ใดๆ ที่เราต้องการ ให้ดำเนินการอยู่เบื้องหลัง หรือสามารถทำงานไปพร้อมๆ กับการทำงานของระบบที่ผู้ใช้สัมผัส หรือสามารถอธิบายอีกนัยหนึ่งคือ ในขณะที่ผู้ใช้มองเห็นการทำงานต่างๆ ผ่านหน้าจออยู่นั้น เบื้องหลังจะมีบาง process กำลังดำเนินการอยู่ โดยไม่รบกวนการทำงานของผู้ใช้

ดังนั้นข้อดีของ Background Jobs คือ

  1. สามารถจัดการการทำงานบาง process ที่อาจล่าช้า ให้ทำงานอยู่เบื้องหลัง เพื่อไม่ให้การแสดงผลต่อ user เกิดการล่าช้า หรือ user friendly นั่นเอง
  2. มีการทำงานเป็น parallel ทำให้สามารถทำงานที่ไม่ขึ้นต่อกันพร้อมๆ กันได้ ซึ่งส่งผลให้ระบบมีประสิทธิภาพมากยิ่งขึ้น

Active Job คืออะไร

Active Job เป็น framework หนึ่งของ rails เพื่อสนับสนุนการทำ background jobs โดยสามารถเริ่มทำ Active Job เบื้องต้นได้ดังนี้

  • สร้าง job

สามารถสร้าง job โดยคำสั่ง rails generate job แล้วตามด้วยชื่อ job เช่น

$ rails generate job hard

จะทำให้ได้ไฟล์มา 2 ไฟล์ คือ ไฟล์สำหรับ unit test และ ไฟล์ของ job

specs/jobs/hard_job_spec.rb

app/jobs/hard_job.rb

  • ตั้งค่า Backend

กำหนด queue adapter ที่ config/application.rb ดังนี้

module MyApp
  class Application < Rails::Application
    config.active_job.queue_adapter = :sidekiq
  end
end

โดย :sidekiq เป็น queuing backend ที่เราเลือกใช้ ซึ่งมีให้เลือกใช้ได้หลากหลาย เช่น Sidekiq, Resque, Delayed Job เป็นต้น

  • กำหนดการทำงานของ job

เป็นการกำหนดว่า job ที่เราสร้างขึ้นนั้น ให้ทำอะไรบ้าง เช่น

class HardJob < ActiveJob::Base
  queue_as:records

  def perform(records)
    records.each do |record|
      record.value = record.num + record.cound
      record.save
    end
  end
end

  • เรียกการทำงานของ job

จากตัวอย่างการทำงานด้านบน เราสามารถเรียกการทำงานได้ดังนี้

HardJob.perform_later(DataRecord.all)

นอกจากนี้ Active Job สามารถเรียกใช้ Callbacks ได้อีกด้วย โดย Callbacks ที่รองรับการเรียกใช้งานของ Active Job ประกอบด้วย

  • before_enqueue
  • around_enqueue
  • after_enqueue
  • before_perform
  • around_perform
  • after_perform

ซึ่งทั้งหมดนี้เป็นเพียงการใช้งาน Active Job เบื้องต้นเท่านั้น และการใช้งาน Background Jobs ให้เกิดประสิทธิภาพนั้น ขึ้นอยู่กับการจัดการของผู้ใช้เอง


สามารถศึกษาเพิ่มเติมได้ที่

http://edgeguides.rubyonrails.org/active_job_basics.html

http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html