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.