Es ist wichtig, über einen schnellen Server zu verfügen, da die Verzögerung bei der Verarbeitung die Einnahmequelle eines Unternehmens buchstäblich zerstören und die Benutzer frustrieren kann. Die Geschwindigkeit einer Website ist die tatsächliche Zeit, die eine Webseite benötigt, um auf dem Bildschirm zu laden, nachdem sie vom Browser angefordert wurde. Stellen Sie sich nun ein Szenario vor, in dem Sie eine riesige Datenbank verwenden und E-Mails an eine Liste senden müssen, die länger als die chinesische Mauer ist. Ob übertrieben oder nicht, das Versenden von E-Mails an eine lange Liste von Personen wird Zeit in Anspruch nehmen, was die Verarbeitungszeit erhöht, was den Server verlangsamt und die Benutzer verärgert.
Die Anforderung, asynchrone Aufgaben für Webanwendungen außerhalb des HTTP-Anforderungsverarbeitungszyklus auszuführen, ist für jedes Unternehmen, das große Datenmengen verarbeitet, ein absolutes Muss. Wenn Sie datenintensive Aufgaben haben, die im Hintergrund erledigt werden müssen, ist die Verwendung von eine der besten Möglichkeiten, dem entgegenzuwirken Verzögerter Job. Wie der Name schon sagt, ist das „Verzögerter Job' ist ein Ruby-Gem, der verwendet werden kann, um bestimmte Aufgaben im Hintergrundprozess in der Rails-Umgebung auszuführen. Die Planung von Aufgaben nach einem Zeitplan ist der gemeinsamen Ausführung von Aufgaben vorzuziehen. Ersteres wird aufgrund der schonenden Ressourcennutzung bevorzugt.
Verzögerter Job Dies ist besonders wichtig, wenn es um den Umgang mit CSV-Dateien geht, bei denen Datensätze dynamischer Natur sind und die Datensatzgröße groß ist. Es beansprucht viel RAM-Speicherplatz und akzeptiert während der Vorbereitung der CSV-Datei keine anderen Anfragen. Um dies zu überwinden, Verzögerter Job Edelstein wird verwendet. Schauen Sie sich die Codes an, um mehr darüber zu erfahren, wie wir dieses Juwel hinzufügen können:
Der übliche Weg
def download require „csv“ csv_string = CSV.generate do |csv| csv << [„ID“,….] @search.each do |site| csv << [site.id, ……..] end end send_data csv_string, :type => 'text/csv', :filename => '_sites_list.csv', :disposition => 'attachment' end
Im obigen Szenario gibt es eine große Anzahl von Spalten mit mehr als 50.000 Datensätzen, wenn diese für alle Datensätze (Sites) angefordert werden, wodurch das System stark ausgelastet wird.
Die Delayed Job Gem-Methode
auf jeden Fall herunterladen
ExportCsv.new(@search.to_a.map(&:id), current_user.id).delay.perform
Ende
Der Link/die Schaltfläche zur Download-Methode sollte ein AJAX-Aufruf sein.
Die benutzerdefinierte Klasse für verzögerte Jobvorgänge im lib-Ordner.
export_csv.rb class ExportCsv < Struct.new(:site_ids, :user_id) def perform require „csv“ User.find(user_id).update_attributes(xls_download: false) # vorab ausführen, um sicherzustellen. sites = Site.where(id: site_ids) CSV.open(„tmp/sites_xls/#{user_id}.csv“, „w+“) tun |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 :perform end
Da wir keine Sitzungsobjekte verwenden können, wurde ein neues Attribut xls_download für die Benutzertabelle erstellt. Das Attribut wird in der vom verzögerten Job bereitgestellten Methode auf „true“ gesetzt, sobald der Prozess der Ausführung der Methode abgeschlossen ist.
Sobald die CSV-Vorbereitung abgeschlossen ist, scheint sich die Datei im Anwendungspfad zu befinden. Wie werden Sie jedoch darüber informiert, dass sie bereit ist und der Schreibvorgang in CSV abgeschlossen ist?
download.js.erb warning('Datei wird zum Herunterladen vorbereitet, Sie werden benachrichtigt, sobald der Vorgang abgeschlossen ist...'); timeout('<%= SOME_DELAY %>');
Was steckt also in der Timeout-Funktion? Wie benachrichtigt das System, dass es bereit ist, die Datei bereitzustellen?
function timeout(time) { setTimeout(function() { $.ajax({ url: „/controller/check_if_ready?“, type: 'GET', dataType: 'json', success: function(response) { if(response. Wert === „Erfolg“) { var Wert = bestätigen(“Datei bereit zum Herunterladen ?”); if (Wert == true) { window.location=“/controller/download_csv.csv“; } sonst if(Wert = = false) { $.ajax({ url: „/controller/remove_file“}) } } else { timeout('4000') // 4 Sekunden warten } }, }); }, time); } Der AJAX-Aufruf. check_if_ready? auf jeden Fall check_if_ready? wenn current_user.set_xls_download? && File.exist?(@file_path) render json: { value: „success“ } else render json: { value: nil } end end
Navigation zu verschiedenen Quellen.
Es scheint, dass alles in Ordnung ist, aber was ist, wenn der Benutzer durch verschiedene Seiten navigiert?
Rufen Sie die Funktion in dem erforderlichen Layout auf.
%script – if session[:download] timeout('#{DELAY}');
Verwenden Sie ein Flag-Attribut, um Umfrageaufrufe durchzuführen. Sobald der Download abgeschlossen ist, können Sie wieder auf Null/Falsch umschalten.
Ein paar letzte Punkte
- Der Verzögerungswert kann basierend auf der Anzahl der Datensätze konfiguriert werden, um die Anzahl der Ajax-Aufrufe zu reduzieren. Bei der Navigation zu verschiedenen Seiten möchten Sie jedoch möglicherweise auch eine geringere Verzögerung, da der Benutzer innerhalb dieses Verzögerungswerts möglicherweise eine weitere Anfrage stellt.
- Löschen Sie die Datei und setzen Sie die Werte nach dem Download zurück.
- Was passiert, wenn mehrere Dateien heruntergeladen werden sollen? Sie können es verarbeiten, indem Sie dem Benutzer erlauben, jeweils nur eine Download-Anfrage zu stellen.
- Beim Capistrano-Bereitstellungsprozess müssen Sie möglicherweise den verzögerten Jobprozess neu starten und sicherstellen, dass kein Download ausgeführt wird. Wenn er nicht behandelt wird – der Ajax-Aufruf gerät möglicherweise in eine Schleife und die Anfrage ist möglicherweise endlos. Der Zählerwert kann verwendet werden, um das Problem zu beheben und die Anfrage abzubrechen.
Lesen Sie ähnliche Artikel:Möchten Sie mehr darüber erfahren, wie dieser und andere Edelsteine funktionieren? Mit genialen Lösungen, fortschrittlichen Geschäftswerten und nachgewiesener Erfolgsbilanz SchienenCarma ist am besten geeignet, Sie bei all Ihren Entwicklungsbedürfnissen zu unterstützen. Unser Entwicklungsprozess basiert stark auf der unermüdlichen Liebe zum Detail, einschließlich Qualität, Design und Exzellenz. Wir setzen Ihre Ideen in die Realität um. Wenn Sie Fragen haben, können Sie dies gerne tun kontaktiere uns.
- Implementierung von TinyMCE in Ruby on Rails
- Grundlegendes zum Asset-Pipeline-Plugin
- Eine einfache Möglichkeit, die Leistung Ihrer Rails-App zu steigern
- Skalieren von Anwendungen mit mehreren Datenbankverbindungen