Il est essentiel de disposer d'un serveur rapide, car les retards de traitement peuvent littéralement tuer les sources de revenus d'une entreprise et frustrer les utilisateurs. La vitesse d'un site Web est le temps réel nécessaire à une page Web pour se charger à l'écran après avoir été demandée par le navigateur. Considérons maintenant un scénario dans lequel vous devez utiliser une énorme base de données et envoyer des e-mails à une liste plus longue que la Muraille de Chine. Exagération ou non, l'envoi d'e-mails à une longue liste de personnes prendra du temps, augmentant le temps de traitement, ce qui ralentira le serveur et ennuyera les utilisateurs.
L'obligation d'effectuer des tâches asynchrones sur des applications Web en dehors du cycle de traitement des requêtes HTTP est une nécessité pour toute organisation gérant des données volumineuses. Si vous avez des tâches qui nécessitent beaucoup de données et doivent être traitées en arrière-plan, l'un des meilleurs moyens de les combattre consiste à utiliser Travail retardé. Comme son nom l'indique, le 'Travail retardé' est une gemme Ruby qui peut être appliquée pour exécuter certaines tâches en arrière-plan dans l'environnement Rails. En planifiant les tâches avec un calendrier plutôt que de les exécuter toutes ensemble, la première est préférée en raison d'une utilisation conservatrice des ressources.
Travail retardé est particulièrement important lorsqu'il s'agit de gérer des fichiers CSV dans lesquels vous avez des enregistrements de nature dynamique et dont la taille est élevée. Il prend beaucoup d'espace RAM et n'accepte pas d'autres requêtes lors de la préparation du fichier CSV. Pour surmonter cela, Travail retardé la gemme est utilisée. Consultez les codes pour en savoir plus sur la façon dont nous pouvons ajouter cette gemme :
La manière habituelle
le téléchargement def nécessite « 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
Dans le scénario ci-dessus, il existe un grand nombre de colonnes avec plus de 50 000 enregistrements lorsque cela est demandé pour tous les enregistrements (sites), cela sollicite le système avec une lourde charge.
La méthode des gemmes de travail différé
téléchargement par définition
ExportCsv.new (@search.to_a.map(&:id), current_user.id).delay.perform
fin
Le lien/bouton pour télécharger la méthode doit être un appel AJAX.
La classe personnalisée pour les opérations de travail retardées dans le dossier 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) Pré-exécution de #, en vous assurant. 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, …..] fin fin fin def après(job) User.find(user_id).update_attributes(xls_download: true) end handle_asynchronously :perform end
Comme nous ne pouvons pas utiliser d'objets de session, un nouvel attribut xls_download a été créé pour la table des utilisateurs. L'attribut sera défini sur true après la méthode fournie par la tâche retardée, une fois le processus de la méthode perform terminé.
Une fois la préparation du CSV terminée, le fichier semble se trouver dans le chemin de l'application, mais comment vous informe-t-il qu'il est prêt et qu'il a terminé le processus d'écriture au format CSV ?
download.js.erb alert('Préparation du fichier à télécharger, vous serez averti une fois terminé…'); timeout('<%= SOME_DELAY %>');
Alors, que se cache-t-il dans la fonction de délai d'attente, comment le système informe-t-il qu'il est prêt à servir le fichier ?
function timeout(time) { setTimeout(function() { $.ajax({ url : "/controller/check_if_ready ?", type : 'GET', dataType : 'json', success : function(response) { if(response. value === "succès") { var value = confirm("Fichier prêt à télécharger ?"); if (value == true) { window.location="/controller/download_csv.csv"; } else if(value = = false) { $.ajax({ url : "/controller/remove_file"}) } } else { timeout('4000') // attendre 4 secondes } }, }); }, time); } L'appel AJAX. check_if_ready ? def check_if_ready ? si current_user.set_xls_download ? && File.exist? (@file_path) render json : { valeur : "succès" } else render json : { valeur : nil } end end
Navigation vers différentes sources.
Il semble que tout va bien, mais que se passe-t-il si l'utilisateur navigue sur différentes pages.
Appelez la fonction dans la mise en page nécessaire.
%script – si session[:download] timeout('#{DELAY}');
Utilisez un attribut flag pour effectuer des appels de sondage, une fois le téléchargement terminé, vous pouvez revenir à nul/false.
Derniers points
- La valeur du délai peut être configurée en fonction du nombre d'enregistrements pour réduire le nombre d'appels Ajax. Mais lors de la navigation vers différentes pages, vous souhaiterez peut-être également avoir un délai plus court, car l'utilisateur peut faire une autre demande dans ce délai.
- Supprimez le fichier et réinitialisez les valeurs après le téléchargement.
- Que se passe-t-il s'il y a une demande de téléchargement de plusieurs fichiers ? Vous pouvez le traiter en permettant à l'utilisateur de faire une seule demande de téléchargement à la fois.
- Lors du processus de déploiement de Capistrano, vous devrez peut-être redémarrer le processus de travail retardé et vous assurer qu'aucun téléchargement n'est en cours. S'il n'est pas géré – L'appel Ajax peut entrer en boucle et la requête peut être sans fin, la valeur du compteur peut être utilisée pour résoudre ce problème et tuer la requête.
Lire des articles similaires :Vous voulez en savoir plus sur le fonctionnement de cette gemme et d’autres joyaux ? Avec des solutions ingénieuses, des valeurs commerciales progressistes et une expérience éprouvée, RailsCarma est le mieux adapté pour vous aider avec tous vos besoins de développement. Notre processus de développement repose en grande partie sur une attention constante aux détails, notamment la qualité, le design et l'excellence. Nous transformons vos idées en réalité. Si vous avez des questions, vous pouvez Contactez-nous.
- Implémentation de TinyMCE dans Ruby on Rails
- Comprendre le plugin Asset Pipeline
- Un moyen simple d'augmenter les performances de votre application Rails
- Mise à l'échelle des applications avec plusieurs connexions à des bases de données