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. [
GitHub - rails/mission_control-jobs: Dashboard and Active Job extensions to operate and troubleshoot background jobs
Dashboard and Active Job extensions to operate and troubleshoot background jobs - rails/mission_control-jobs
GitHubrails
https://github.com/rails/mission_control-jobs
ℹ️
Sebelum membaca lebih lanjut, saya ingin memberitahukan bahwa blog ini juga tersedia dalam bentuk Newsletter. Cukup dengan mendaftarkan email di bawah ini.
Sign up for Tales of a Gamer Dad
From Command Line to Finish Line: Coding in a Game of Life
Subscribe .nc-loop-dots-4-24-icon-o{–animation-duration:0.8s} .nc-loop-dots-4-24-icon-o *{opacity:.4;transform:scale(.75);animation:nc-loop-dots-4-anim var(–animation-duration) infinite} .nc-loop-dots-4-24-icon-o :nth-child(1){transform-origin:4px 12px;animation-delay:-.3s;animation-delay:calc(var(–animation-duration)/-2.666)} .nc-loop-dots-4-24-icon-o :nth-child(2){transform-origin:12px 12px;animation-delay:-.15s;animation-delay:calc(var(–animation-duration)/-5.333)} .nc-loop-dots-4-24-icon-o :nth-child(3){transform-origin:20px 12px} @keyframes nc-loop-dots-4-anim{0%,100%{opacity:.4;transform:scale(.75)}50%{opacity:1;transform:scale(1)}}
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
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"