Se durante una request fai qualcosa di lento (mandare una mail, chiamare un'API esterna, elaborare dati), l'utente aspetta. La soluzione è spostare quel lavoro in un job in background.
class SyncLaunchesJob < ApplicationJob
queue_as :default
def perform
LaunchLibrary.upcoming.each do |data|
Launch.upsert(data, unique_by: :name)
end
end
end
# nel controller: rispondi subito, lavora dopo
SyncLaunchesJob.perform_later
perform_later mette il job in coda e restituisce il controllo immediatamente; un worker separato (Sidekiq, Solid Queue) lo esegue in background.
Così la sincronizzazione dei lanci da un'API lenta non blocca nessuno: la request torna in millisecondi, il lavoro pesante avviene fuori scena. È il modo giusto per tenere l'app reattiva.