encyklopedia.space

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.rb lub config/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) oraz perform_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ń

  1. Wysyłanie e‑maili po rejestracji użytkownika (Action Mailer + deliver_later).
  2. Generowanie raportów PDF w tle, aby nie blokować interfejsu użytkownika.
  3. Przetwarzanie obrazów i wideo – konwersja, miniatury, kodowanie.
  4. Synchronizacja danych z zewnętrznymi API.
  5. 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.