È essenziale disporre di un server veloce poiché il ritardo nell'elaborazione può letteralmente uccidere il flusso di entrate di un'azienda e frustrare gli utenti. La velocità di un sito web è il tempo effettivo impiegato da una pagina web per caricarsi sullo schermo dopo essere stata richiesta dal browser. Consideriamo ora uno scenario in cui è necessario utilizzare un enorme database e inviare e-mail a un elenco più lungo della Muraglia cinese. Esagerato o no, l'invio di email a un lungo elenco di persone richiederà tempo, aumentando i tempi di elaborazione che rallenteranno il server e infastidiranno gli utenti.
Il requisito di eseguire attività asincrone sulle applicazioni Web al di fuori del ciclo di gestione delle richieste HTTP è una necessità per qualsiasi organizzazione che gestisce dati pesanti. Se hai attività che richiedono molti dati e devono essere gestite in background, uno dei modi migliori per combatterlo è utilizzare Lavoro ritardato. Come suggerisce il nome stesso, l'Lavoro ritardato' è una gemma di rubino che può essere applicata per eseguire determinate attività nel processo in background nell'ambiente Rails. Pianificare le attività con un calendario rispetto a eseguirle tutte insieme, la prima è preferita a causa dell'utilizzo conservativo delle risorse.
Lavoro ritardato è particolarmente importante quando si tratta di gestire file CSV in cui sono presenti record di natura dinamica e di dimensioni elevate. Richiede molto spazio RAM e non accetta altre richieste durante la preparazione del file CSV. Per superare questo, Lavoro ritardato viene utilizzata la gemma. Controlla i codici per saperne di più su come possiamo aggiungere questo gioiello:
Il solito modo
def download richiede “csv” csv_string = CSV.generate do |csv| csv << [“ID”,….] @search.each do |site| csv << [sito.id, ……..] end end send_data csv_string, :type => 'testo/csv', :filename => '_sites_list.csv', :disposition => 'allegato' end
Nello scenario sopra riportato, è presente un numero elevato di colonne con oltre 50.000 record, quando richiesto per tutti i record (siti) il sistema è sottoposto a carichi pesanti.
Il metodo della gemma del lavoro ritardato
download definitivo
ExportCsv.new(@search.to_a.map(&:id), current_user.id).delay.perform
FINE
Il collegamento/pulsante per il metodo di download dovrebbe essere una chiamata AJAX.
La classe personalizzata per le operazioni di lavoro ritardate nella cartella lib.
export_csv.rb class ExportCsv < Struct.new(:site_ids, :user_id) def perform require “csv” User.find(user_id).update_attributes(xls_download: false) # pre-run, assicurandosi. siti = Sito.where(id: site_ids) CSV.open(“tmp/sites_xls/#{user_id}.csv”, “w+”) do |csv| csv << [“ID”, …..] sites.each do |site| csv << [site.id, …..] end end end def after(job) User.find(user_id).update_attributes(xls_download: true) end handle_asynchronously :esegui end
Poiché non possiamo utilizzare oggetti di sessione, è stato creato un nuovo attributo xls_download per la tabella degli utenti. L'attributo verrà impostato su true dopo il metodo fornito dal lavoro ritardato, una volta completato il processo di esecuzione del metodo.
Una volta completata la preparazione del CSV, il file sembra trovarsi nel percorso dell'applicazione ma come ti informa che è pronto e ha completato il processo di scrittura su CSV?
download.js.erb alert('Preparazione del file da scaricare, riceverai una notifica una volta completato…'); timeout('<%= SOME_DELAY %>');
Quindi cosa si nasconde nella funzione di timeout, in che modo il sistema notifica che è pronto per servire il file?
function timeout(time) { setTimeout(function() { $.ajax({ url: “/controller/check_if_ready?”, type: 'GET', dataType: 'json', success: function(response) { if(response. valore === “successo”) { var valore = confirm(“File pronto per il download?”); if (valore == true) { window.location=”/controller/download_csv.csv”; } else if(valore = = false) { $.ajax({ url: “/controller/remove_file”}) } } else { timeout('4000') // attendi 4 secondi } }, }); }, time); } La chiamata AJAX. controlla_se_pronto? def controlla_se_pronto? se current_user.set_xls_download? && File.exist?(@file_path) render json: { valore: “successo” } else render json: { valore: nil } end end
Navigazione verso diverse fonti.
Sembra che vada tutto bene, ma cosa succede se l'utente naviga su pagine diverse?
Chiama la funzione nel layout necessario.
%script – se sessione[:download] timeout('#{DELAY}');
Utilizza un attributo flag per effettuare chiamate di sondaggio, una volta completato il download puoi tornare a nil/false.
Ultimi punti
- Il valore del ritardo può essere configurato in base al conteggio dei record per ridurre il numero di chiamate Ajax. Ma durante la navigazione verso pagine diverse potresti anche voler avere un ritardo minore, poiché l'utente potrebbe effettuare un'altra richiesta entro quel valore di ritardo.
- Eliminare il file e reimpostare i valori dopo il download.
- Cosa succede se c'è una richiesta di download di più file? Puoi elaborarlo consentendo all'utente di effettuare una sola richiesta di download alla volta.
- Nel processo di distribuzione Capistrano, potrebbe essere necessario riavviare il processo di lavoro ritardato e assicurarsi che non sia in corso alcun download. Se non gestita: la chiamata Ajax potrebbe entrare in loop e la richiesta potrebbe essere infinita, è possibile utilizzare il controvalore per risolvere questo problema e interrompere la richiesta.
Leggi articoli simili:Vuoi saperne di più su come funzionano questa e altre gemme? Con soluzioni ingegnose, valori aziendali progressisti e comprovata esperienza, RailsCarma è più adatto per aiutarti con tutte le tue esigenze di sviluppo. Il nostro processo di sviluppo si basa fortemente sull'instancabile attenzione ai dettagli, tra cui qualità, design ed eccellenza. Trasformiamo le tue idee in realtà. Se hai qualche domanda, puoi Contattaci.
- Implementazione di TinyMCE in Ruby on Rails
- Comprensione del plugin Asset Pipeline
- Un modo semplice per aumentare le prestazioni della tua app Rails
- Applicazioni scalabili con connessioni multiple a database