Manajemen background jobs dengan Mission Control
Mission Control—Jobs adalah gem berbasis Rails yang memberikan front-end untuk manajemen background jobs. Gem ini memberikan kemudahan untuk mengelola background jobs dari Resque dan Solid Queue. Sebagai solo developer, keberadaan gem ini sangat membantu untuk mengelola background jobs terutama pada proyek kecil dan sampingan. Biasanya manajemen background jobs ini ditawarkan sebagai managed service oleh provider cloud, tentunya dengan biaya terpisah. Dengan adanya gem ini, seorang solo developer bisa mengelola background jobs secara swadaya dan melakukan penghematan yang luar biasa.
Autentikasi
Mission Control memberikan autentikasi HTTP basic secara default. Secara default, Mission Control tidak bisa diakses apabila kita tidak memberikan credential berupa username dan password. Contoh sederhananya adalah seperti ini:
mission_control:
http_basic_auth_user: dev
http_basic_auth_password: secret
Disarankan bagi pengguna untuk membuat sendiri autentikasi sesuai dengan aplikasi yang kita buat. Misalnya, dengan memberikan sebuah controller yang terlindungi dibalik autentikasi:
config.mission_control.jobs.base_controller_class = "AdminController"
Lebih lanjut mengenai ini: https://github.com/rails/mission_control-jobs?tab=readme-ov-file#custom-authentication
Fitur standar
Mission Control membagi setiap state dari Background Job dalam tab terpisah. Bagi yang terbiasa melihat Resque Web, ini cukup familiar. Fitur-fiturnya adalah:
- queued jobs berdasarkan state (failed, in progress, blocked, scheduled, finished)
- manajemen workers
- recurring tasks
CLI Helper
Tak hanya front-end, Mission Control juga memberikan helper untuk Command Line Interface. Ini sangat berguna untuk debugging job. Sering dibutuhkan ketika operasi yang kita inginkan tidak disajikan di front-end. Misalnya, membuat query yang lebih spesifik.
Sedikit tambahan
Log dari background jobs akan cepat memakan database apabila dibiarkan begitu saja. Namun log ini akan sangat berguna untuk menginvestigasi sebuah isu. Sebagai solo developer, saya biasanya memberikan waktu 7 hari untuk menyimpan log. Alasannya karena saya tidak ingin tagihan server tiba-tiba membengkak tanpa secara perlahan.
Di sini saya membuat background job untuk menghapus job yang sudah dikerjakan, alias finished. Job ini akan berjalan setiap hari dan akan menghapus job dari 7 hari sebelumnya.
class FinishedJobsPurgingJob < ApplicationJob
EXPIRATION_TIME = 7.days
queue_as :default
def perform
finished_jobs.find_each do |job|
Rails.logger.debug { "Destroyed Job ID: #{job.active_job_id}" }
job.destroy
end
end
private
def finished_jobs
@_finished_jobs ||= SolidQueue::Job.finished.where(finished_at: ..EXPIRATION_TIME.ago)
end
end
Dan jangan lupa ditambahkan ke dalam recurring.yml
apabila menggunakan solid_queue
:
production:
finished_jobs_purging_job:
class: FinishedJobsPurgingJob
schedule: "every day at 00:15"