Gema de trabajo retrasado para CSV

Es esencial tener un servidor rápido ya que la demora en el procesamiento puede literalmente acabar con el flujo de ingresos de una empresa y frustrar a los usuarios. La velocidad de un sitio web es el tiempo real que tarda una página web en cargarse en la pantalla después de ser solicitada por el navegador. Ahora considere un escenario en el que necesita utilizar una base de datos enorme y enviar correos electrónicos a una lista más larga que el Muro de China. Exageración o no, enviar correos electrónicos a una larga lista de personas llevará tiempo, aumentando el tiempo de procesamiento, lo que ralentizará el servidor y molestará a los usuarios.

El requisito de realizar tareas asincrónicas en aplicaciones web fuera del ciclo de manejo de solicitudes HTTP es una necesidad para cualquier organización que maneje datos pesados. Si tiene tareas que requieren muchos datos y deben manejarse en segundo plano, una de las mejores formas de combatirlas es mediante el uso Trabajo retrasado. Como sugiere el propio nombre, el 'Trabajo retrasado' es una gema Ruby que se puede aplicar para ejecutar ciertas tareas en un proceso en segundo plano en el entorno Rails. Programar tareas con un cronograma para ejecutarlas todas juntas; se prefiere la primera debido al uso conservador de los recursos.

Trabajo retrasado Esto es especialmente importante cuando se trata de manejar archivos CSV donde hay registros que son de naturaleza dinámica y el tamaño de los registros es alto. Ocupa mucho espacio RAM y no acepta otras solicitudes durante la preparación del archivo CSV. Para superar esto, Trabajo retrasado Se utiliza gema. Consulte los códigos para obtener más información sobre cómo podemos agregar esta joya:

La forma habitual

la descarga def requiere “csv” csv_string = CSV.generate do |csv| csv << [“ID”,….] @search.each hacer |sitio| csv << [site.id, ……..] end end send_data csv_string, :type => 'text/csv', :filename => '_sites_list.csv', :disposition => 'adjunto' end

En el escenario anterior, hay una gran cantidad de columnas con más de 50.000 registros cuando se solicitan para todos los registros (sitios), lo que mantiene el sistema con una carga pesada.

El método de la gema del trabajo retrasado

descargar definitivamente

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

fin

El enlace/botón para descargar el método debe ser una llamada AJAX.

La clase personalizada para operaciones de trabajo retrasadas en la carpeta lib.

export_csv.rb clase ExportCsv < Struct.new(:site_ids, :user_id) def realizar requiere “csv” User.find(user_id).update_attributes(xls_download: false) Ejecución previa de #, asegurándose. sitios = Sitio.donde(id: site_ids) CSV.open(“tmp/sites_xls/#{user_id}.csv”, “w+”) hacer |csv| csv << [“ID”, …..] sitios.cada uno |sitio| csv << [site.id,…..] end end end def after(job) User.find(user_id).update_attributes(xls_download: true) end handle_asynchronously: realizar fin

Como no podemos usar objetos de sesión, se creó un nuevo atributo xls_download para la tabla de usuarios. El atributo se establecerá en verdadero después del método proporcionado por el trabajo retrasado, una vez que se complete el proceso del método de ejecución.

Una vez que se completa la preparación del CSV, el archivo parece estar en la ruta de la aplicación, pero ¿cómo le informa que está listo y que ha completado el proceso de escritura en CSV?

download.js.erb alert('Preparando el archivo para descargar, se le notificará una vez que esté completo...'); timeout('<%= ALGUNO_DELAY %>');

Entonces, ¿qué hay dentro de la función de tiempo de espera? ¿Cómo notifica el sistema que está listo para entregar el archivo?

función timeout(time) { setTimeout(function() { $.ajax({ url: “/controller/check_if_ready?”, tipo: 'GET', dataType: 'json', éxito: function(response) { if(response. valor === “éxito”) { var valor = confirmar(“¿Archivo listo para descargar?”); if (valor == verdadero) { window.location=”/controller/download_csv.csv”; } else if(valor = = false) { $.ajax({ url: “/controller/remove_file”}) } } else { timeout('4000') // espera 4 segundos } }, }); }, tiempo); } La llamada AJAX. check_if_ready? def check_if_ready? si current_user.set_xls_download? && File.exist?(@file_path) renderizar json: {valor: "éxito"} más renderizar json: {valor: nil} fin fin

Navegación a diferentes fuentes.

Parece que todo está bien, pero ¿qué pasa si el usuario navega por diferentes páginas?

Llame a la función en cualquier diseño necesario.

%script – si la sesión[:descarga] se agota el tiempo de espera('#{DELAY}');

Utilice un atributo de bandera para realizar llamadas de encuesta; una vez que se complete la descarga, puede volver a cero/falso.

Algunos puntos finales

  • El valor de retraso se puede configurar en función del recuento de registros para reducir la cantidad de llamadas Ajax. Pero en la navegación a diferentes páginas es posible que también desee tener un retraso menor, ya que el usuario puede realizar otra solicitud dentro de ese valor de retraso.
  • Elimine el archivo y restablezca los valores después de la descarga.
  • ¿Qué pasa si hay una solicitud de descarga de varios archivos? Puede procesarlo permitiendo al usuario realizar solo una solicitud de descarga a la vez.
  • En el proceso de implementación de Capistrano, es posible que deba reiniciar el proceso de trabajo retrasado y asegurarse de que no haya ninguna descarga en curso. Si no se maneja: la llamada Ajax puede entrar en bucle y la solicitud puede ser interminable; se puede usar el valor del contador para solucionar este problema y eliminar la solicitud.

¿Quieres saber más sobre cómo funcionan esta y otras joyas? Con soluciones ingeniosas, valores comerciales progresivos y un historial comprobado, RielesCarma es el más adecuado para ayudarle con todas sus necesidades de desarrollo. Nuestro proceso de desarrollo se basa en gran medida en una atención incesante a los detalles, incluida la calidad, el diseño y la excelencia. Convertimos tus ideas en realidad. Si tiene alguna consulta, puede Contáctenos.

Leer artículos similares: Póngase en contacto con nosotros.

Suscríbete para recibir las últimas actualizaciones

Artículos Relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESSpanish