Active Job
Active Job – abstrakcyjny interfejs do obsługi zadań asynchronicznych w frameworku Ruby on Rails. Umożliwia definiowanie i uruchamianie zadań w kolejce niezależnie od używanego systemu kolejkowego (tzw. adaptera), takiego jak Sidekiq, Resque, Delayed Job czy Amazon SQS. Dzięki temu programiści mogą pisać kod jednorodny, a jednocześnie wybrać najodpowiedniejsze narzędzie do przetwarzania w tle.
Historia
Active Job został wprowadzony w Railsie w wersji 4.2, wydanej w 2015 roku. Jego twórcy dążyli do standaryzacji sposobu, w jaki aplikacje Railsowe korzystają z systemów kolejkowych, eliminując potrzebę rozpraszania logiki w różnych adapterach.
Podstawowe pojęcia
- Job (zadanie) – klasa dziedzicząca po
ApplicationJob, definiująca metodęperform, w której umieszczany jest kod do wykonania w tle. - Adapter (adapter) – warstwa pośrednicząca między Active Job a konkretnym systemem kolejkowym. Konfiguracja odbywa się w pliku
config/application.rblubconfig/environments/*.rb. - Queue (kolejka) – logiczny kanał, w którym przechowywane są zadania do przetworzenia. Active Job umożliwia przypisywanie zadań do określonych kolejek, co pozwala na priorytetyzację i rozdzielanie obciążenia.
- Enqueue (kolejkowanie) – akcja dodania zadania do kolejki. Dostępne są metody
perform_later(asynchronicznie) orazperform_now(synchronicznie, dla testów).
Tworzenie i użycie zadania
# app/jobs/example_job.rb
class ExampleJob < ApplicationJob
queue_as :default
def perform(param1, param2)
# kod wykonywany w tle
puts "Processing #{param1} i #{param2}"
end
end
# wywołanie (asynchroniczne)
ExampleJob.perform_later('foo', 42)
# wywołanie (synchroniczne – tylko w trybie testowym)
ExampleJob.perform_now('foo', 42)
Obsługiwane adaptery
W standardowej instalacji Rails dostarcza adaptery dla następujących systemów:
- Async – wbudowany prosty adapter oparty na wątkach Ruby.
- Test – używany w środowisku testowym, przechowuje zadania w pamięci.
- Sidekiq – szybki, oparty na Redis backend.
- Resque – kolejka zbudowana wokół Redis, wykorzystująca procesy robocze.
- Delayed Job – opiera się na bazie danych (np. PostgreSQL).
- Amazon SQS – usługa kolejkowa w chmurze Amazon Web Services.
Konfiguracja
Wybór adaptera odbywa się w plikach konfiguracyjnych Rails:
# config/application.rb
module MyApp
class Application < Rails::Application
config.active_job.queue_adapter = :sidekiq
end
end
Po zmianie adaptera należy zrestartować procesy robocze (np. bundle exec sidekiq).
Zalety korzystania z Active Job
- Jednolity interfejs – kod aplikacji nie jest zależny od konkretnego systemu kolejkowego.
- Łatwe przełączanie adapterów – zmiana jednego wiersza konfiguracji pozwala na testowanie różnych rozwiązań.
- Wsparcie przez społeczność Rails – regularne aktualizacje i dokumentacja.
- Integracja z innymi komponentami Rails, takimi jak Action Mailer (np.
deliver_later) i Active Record (np.after_commit).
Ograniczenia i uwagi
- Nie wszystkie funkcje konkretnego adaptera są dostępne w interfejsie Active Job (np. grupowanie zadań w Sidekiq).
- Wydajność może zależeć od wybranego backendu – w przypadku dużego wolumenu zadań często rekomenduje się Sidekiq lub Resque.
- Obsługa błędów – Active Job przekazuje wyjątki do adaptera, który decyduje o ich ponownym przetworzeniu lub przeniesieniu do „dead‑letter queue”.
Powiązane pojęcia
Więcej informacji można znaleźć w następujących artykułach:
Przykłady zastosowań
- Wysyłanie e‑maili po rejestracji użytkownika (Action Mailer +
deliver_later). - Generowanie raportów PDF w tle, aby nie blokować interfejsu użytkownika.
- Przetwarzanie obrazów i wideo – konwersja, miniatury, kodowanie.
- Synchronizacja danych z zewnętrznymi API.
- Czyszczenie i archiwizacja rekordów w bazie danych.
Podsumowanie
Active Job jest kluczowym elementem ekosystemu Rails, który upraszcza wdrażanie asynchronicznych operacji i pozwala programistom skupić się na logice biznesowej, a nie na szczegółach implementacji systemu kolejkowego.