Gem „Verzögerter Job“ für CSV

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 is especially more important when it comes to handling CSV files where you have records which are dynamic in nature and size of records are high. It takes a lot of RAM space and doesn’t accept other requests during the preparation of CSV file. To overcome this, 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) # pre-run, making sure. sites = Site.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 :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 alert(‘Preparing file to download, you will be notified once its complete…’); 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.value === “success”) { var value = confirm(“File ready to download ?”); if (value == true) { window.location=”/controller/download_csv.csv”; } else if(value == false) { $.ajax({ url: “/controller/remove_file”}) } } else { timeout(‘4000’) // wait 4 seconds } }, }); }, time); } The AJAX call. check_if_ready? def check_if_ready? if current_user.set_xls_download? && File.exist?(@file_path) render json: { value: “success” } else render json: { value: nil } end end

Navigation zu verschiedenen Quellen.

It seems everything’s fine but what if the user navigates different pages.

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.
  • On Capistrano deployment process, you may have to restart the delayed job process and make sure no download is in progress. If not handled – The Ajax call may get into loop and request may be endless, counter value can be used to fix this and kill the request.

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.

Lesen Sie ähnliche Artikel: Nehmen Sie Kontakt mit uns auf.

Abonnieren Sie die neuesten Updates

zusammenhängende Posts

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

German
English
English
Japanese
German
French
Spanish

WhatsApp uns

Beenden Sie die mobile Version