Försenat jobb pärla för CSV

Det är viktigt att ha en snabb server eftersom förseningen i bearbetningen bokstavligen kan döda ett företags inkomstström och frustrera användarna. Hastigheten på en webbplats är den faktiska tid det tar för en webbsida att laddas på skärmen efter att ha begärts av webbläsaren. Tänk nu på ett scenario där du behöver använda en enorm databas och skicka e-postmeddelanden till en lista längre än den kinesiska muren. Överdrift eller inte, att skicka e-postmeddelanden till en lång lista med människor kommer att ta tid, vilket ökar bearbetningstiden vilket kommer att sakta ner servern och irritera användarna.

Kravet på att utföra asynkrona uppgifter på webbapplikationer utanför HTTP-förfrågningshanteringscykeln är en nödvändighet för alla organisationer som hanterar tung data. Om du har uppgifter som är datatunga och måste hanteras i bakgrunden, är ett av de bästa sätten att bekämpa det genom att använda Försenat jobb. Som namnet självt antyder,Försenat jobb' är en rubinpärla som kan användas för att utföra vissa uppgifter i bakgrundsprocessen i Rails-miljön. Att schemalägga uppgifter med en tidtabell mot att köra dem alla tillsammans, den förra är att föredra på grund av konservativ användning av resurser.

Försenat jobb är särskilt viktigare när det kommer till hantering av CSV-filer där du har poster som är dynamiska till sin natur och storleken på posterna är hög. Det tar mycket RAM-utrymme och accepterar inte andra förfrågningar under förberedelsen av CSV-filen. För att övervinna detta, Försenat jobb pärla används. Kolla in koderna för att ta reda på mer om hur vi kan lägga till denna pärla:

Det vanliga sättet

def nedladdning kräver "csv" csv_string = CSV.generate gör |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

I ovanstående scenario finns det ett stort antal kolumner med 50k+ poster när det efterfrågas för alla poster (webbplatser) det håller upp systemet med stor belastning.

Metoden för fördröjda jobb

def nedladdning

ExportCsv.new(@search.to_a.map(&:id), current_user.id).delay.perform

slutet

Länken/knappen för att ladda ner metoden bör vara ett AJAX-anrop.

Den anpassade klassen för fördröjda jobboperationer i lib-mappen.

export_csv.rb klass ExportCsv < Struct.new(:site_ids, :user_id) def perform require “csv” User.find(user_id).update_attributes(xls_download: false) # förkör, se till. 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

Eftersom vi inte kan använda sessionsobjekt skapades ett nytt attribut xls_download för användartabellen. Attributet kommer att ställas in på true in after-metoden som tillhandahålls av det fördröjda jobbet, när processen för att utföra metoden är klar.

När csv-förberedelserna är klara verkar filen vara i ansökningssökvägen, men hur informerar den dig om att den är klar och har slutfört processen att skriva till CSV?

download.js.erb alert('Förbereder fil för nedladdning, du kommer att meddelas när den är klar...'); timeout('<%= SOME_DELAY %>');

Så vad ligger inuti timeout-funktionen, hur meddelar systemet att det är redo att servera filen?

function timeout(time) { setTimeout(function() { $.ajax({ url: “/controller/check_if_ready?”, skriv: 'GET', dataType: 'json', success: function(response) { if(response. värde === “success”) { var value = confirm(“Filen redo att laddas ned?”); if (value == true) { window.location=”/controller/download_csv.csv”; } else if(value = = false) { $.ajax({ url: “/controller/remove_file”}) } } else { timeout('4000') // vänta 4 sekunder } }, }); }, tid); } AJAX-anropet. check_if_ready? def check_if_ready? om current_user.set_xls_download? && File.exist?(@file_path) render json: { value: “success” } else render json: { value: noll } end end

Navigering till olika källor.

Det verkar som om allt är bra men tänk om användaren navigerar på olika sidor.

Anropa funktionen i vilken layout som behövs.

%script – if session[:download] timeout('#{DELAY}');

Använd ett flaggattribut för att göra omröstningsanrop, när nedladdningen är klar kan du växla tillbaka till noll/falsk.

Sista poängen

  • Fördröjningsvärdet kan konfigureras baserat på antalet poster för att minska antalet Ajax-samtal. Men vid navigering till olika sidor kanske du också vill ha mindre fördröjning, eftersom användaren kan göra en annan begäran inom det fördröjningsvärdet.
  • Ta bort filen och återställ värdena efter nedladdningen.
  • Vad händer om det finns en begäran om nedladdning av flera filer? Du kan bearbeta det genom att tillåta användaren att endast göra en nedladdningsbegäran åt gången.
  • På Capistrano-distributionsprocessen kan du behöva starta om den försenade jobbprocessen och se till att ingen nedladdning pågår. Om det inte hanteras – Ajax-samtalet kan hamna i loop och begäran kan vara oändlig, räknarvärde kan användas för att fixa detta och döda begäran.

Vill du veta mer om hur denna och andra pärlor fungerar? Med geniala lösningar, progressiva affärsvärden och beprövad meritlista, RailsCarma är bäst lämpad att hjälpa dig med alla dina utvecklingsbehov. Vår utvecklingsprocess är starkt förankrad på outtröttlig uppmärksamhet på detaljer, inklusive kvalitet, design och excellens. Vi omsätter dina idéer till verklighet. Om du har några frågor kan du kontakta oss.

Läs liknande artiklar: Kontakta oss.

Prenumerera för de senaste uppdateringarna

relaterade inlägg

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

sv_SESwedish