โดย แสงเดือน จันทร์ใหม่ – 3 สิงหาคม 2558
Background Jobs คืออะไร
Background Jobs คือการทำงานของ process ใดๆ ที่เราต้องการ ให้ดำเนินการอยู่เบื้องหลัง หรือสามารถทำงานไปพร้อมๆ กับการทำงานของระบบที่ผู้ใช้สัมผัส หรือสามารถอธิบายอีกนัยหนึ่งคือ ในขณะที่ผู้ใช้มองเห็นการทำงานต่างๆ ผ่านหน้าจออยู่นั้น เบื้องหลังจะมีบาง process กำลังดำเนินการอยู่ โดยไม่รบกวนการทำงานของผู้ใช้
ดังนั้นข้อดีของ Background Jobs คือ
- สามารถจัดการการทำงานบาง process ที่อาจล่าช้า ให้ทำงานอยู่เบื้องหลัง เพื่อไม่ให้การแสดงผลต่อ user เกิดการล่าช้า หรือ user friendly นั่นเอง
- มีการทำงานเป็น parallel ทำให้สามารถทำงานที่ไม่ขึ้นต่อกันพร้อมๆ กันได้ ซึ่งส่งผลให้ระบบมีประสิทธิภาพมากยิ่งขึ้น
Active Job คืออะไร
Active Job เป็น framework หนึ่งของ rails เพื่อสนับสนุนการทำ background jobs โดยสามารถเริ่มทำ Active Job เบื้องต้นได้ดังนี้
- สร้าง job
สามารถสร้าง job โดยคำสั่ง rails generate job แล้วตามด้วยชื่อ job เช่น
[code language="ruby"]
$ rails generate job hard
[/code]
จะทำให้ได้ไฟล์มา 2 ไฟล์ คือ ไฟล์สำหรับ unit test และ ไฟล์ของ job
specs/jobs/hard_job_spec.rb
app/jobs/hard_job.rb
- ตั้งค่า Backend
กำหนด queue adapter ที่ config/application.rb ดังนี้
[code language="ruby"]
module MyApp
class Application < Rails::Application
config.active_job.queue_adapter = :sidekiq
end
end
[/code]
โดย :sidekiq เป็น queuing backend ที่เราเลือกใช้ ซึ่งมีให้เลือกใช้ได้หลากหลาย เช่น Sidekiq, Resque, Delayed Job เป็นต้น
- กำหนดการทำงานของ job
เป็นการกำหนดว่า job ที่เราสร้างขึ้นนั้น ให้ทำอะไรบ้าง เช่น
[code language="ruby"]
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
[/code]
- เรียกการทำงานของ job
จากตัวอย่างการทำงานด้านบน เราสามารถเรียกการทำงานได้ดังนี้
[code language="ruby"]
HardJob.perform_later(DataRecord.all)
[/code]
นอกจากนี้ 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