処理の遅延は文字通りビジネスの収益源を失い、ユーザーをイライラさせる可能性があるため、高速なサーバーを用意することが不可欠です。 Web サイトの速度は、ブラウザーによって要求されてから Web ページが画面に読み込まれるまでにかかる実際の時間です。ここで、巨大なデータベースを使用し、中国の壁よりも長いリストに電子メールを送信する必要があるシナリオを考えてみましょう。大げさであろうとなかろうと、多数のリストに電子メールを送信するには時間がかかり、処理時間が長くなり、サーバーの速度が低下し、ユーザーを悩ませることになります。
HTTP リクエスト処理サイクルから離れて Web アプリケーションで非同期タスクを実行するという要件は、大量のデータを扱う組織にとって必須の悩みです。データ量が多く、バックグラウンドで処理する必要があるタスクがある場合、それに対処する最善の方法の 1 つは、 遅延したジョブ。名前自体が示すように、「遅延したジョブ' は、Rails 環境のバックグラウンド プロセスで特定のタスクを実行するために適用できる Ruby gem です。すべてのタスクを同時に実行するのではなく、タイムテーブルを使用してタスクをスケジュールします。リソースの使用量が控えめであるため、前者の方が優先されます。
遅延したジョブ 本質的に動的でレコードのサイズが大きい CSV ファイルを処理する場合、これは特に重要です。大量の RAM スペースを必要とし、CSV ファイルの準備中は他のリクエストを受け付けません。これを克服するには、 遅延したジョブ 宝石が使われています。この gem を追加する方法の詳細については、コードを確認してください。
いつものやり方
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
上記のシナリオでは、すべてのレコード (サイト) を要求すると、50,000 件を超えるレコードを持つ列が多数存在し、システムに大きな負荷がかかります。
遅延ジョブ Gem メソッド
デフォルトのダウンロード
ExportCsv.new(@search.to_a.map(&:id), current_user.id).lay.perform
終わり
ダウンロード メソッドへのリンク/ボタンは AJAX 呼び出しである必要があります。
lib フォルダー内の遅延ジョブ操作のカスタム クラス。
export_csv.rb class ExportCsv < Struct.new(:site_ids, :user_id) def run require "csv" User.find(user_id).update_attributes(xls_download: false) # 事前実行、確認します。 sites = Site.where(id: site_ids) CSV.open(“tmp/sites_xls/#{user_id}.csv”, “w+”) do |csv| csv << [“ID”, …..] sites.each は |site| を実行します。 csv << [site.id, …..] end end end def after(job) User.find(user_id).update_attributes(xls_download: true) end handle_asynchronously :perform end
セッション オブジェクトを使用できないため、users テーブルに新しい属性 xls_download が作成されました。属性は、perform メソッドの処理が完了すると、遅延ジョブによって提供される after メソッドで true に設定されます。
CSV の準備が完了すると、ファイルはアプリケーション パスにあるように見えますが、準備ができたこと、CSV への書き込みプロセスが完了したことはどのようにして通知されるのでしょうか?
download.js.erbalert('ファイルのダウンロードを準備しています。完了したら通知されます…');タイムアウト('<%= SOME_DELAY %>');
では、タイムアウト関数の内部には何があり、システムはファイルを提供する準備ができたことをどのように通知するのでしょうか?
function timeout(time) { setTimeout(function() { $.ajax({ url: “/controller/check_if_ready?”, type : 'GET', dataType : 'json', success: function(response) { if(response. value === “成功”) { var value =confirm(“ファイルをダウンロードする準備ができました?”); if (value == true) { window.location=”/controller/download_csv.csv”; } else if(value = = false) { $.ajax({ url: “/controller/remove_file”}) } } else { timeout('4000') // 4 秒待ちます } }, }); }, time); AJAX 呼び出し。チェックイフ_レディ? def check_if_ready? current_user.set_xls_download の場合? && File.exist?(@file_path) render json: { value: “success” } else render json: { value: nil } end end
さまざまなソースへのナビゲーション。
すべて問題ないようですが、ユーザーが別のページに移動した場合はどうなるでしょうか。
必要なレイアウトで関数を呼び出します。
%script – if session[:download] timeout('#{DELAY}');
flag 属性を使用してポーリング呼び出しを行います。ダウンロードが完了したら、nil/false に切り替えることができます。
最後の数点
- レコード数に基づいて遅延値を構成し、Ajax 呼び出しの数を減らすことができます。ただし、別のページへのナビゲーションでは、ユーザーがその遅延値内で別のリクエストを行う可能性があるため、遅延を小さくすることも必要になる場合があります。
- ダウンロード後にファイルを削除し、値をリセットします。
- 複数のファイルのダウンロード要求があった場合はどうすればよいですか?ユーザーが一度に 1 つのダウンロード要求のみを行えるようにすることで、これを処理できます。
- Capistrano の展開プロセスでは、遅延したジョブ プロセスを再起動して、ダウンロードが進行中でないことを確認する必要がある場合があります。処理されない場合 – Ajax 呼び出しがループになり、リクエストが無限に続く可能性があります。カウンター値を使用してこれを修正し、リクエストを強制終了できます。
同様の記事を読む:この宝石や他の宝石がどのように機能するかについて詳しく知りたいですか?独創的なソリューション、進歩的なビジネス価値、実証済みの実績により、 レールカーマ 開発のあらゆるニーズを支援するのに最適です。当社の開発プロセスは、品質、デザイン、卓越性など、細部へのたゆまぬこだわりに基づいて確立されています。私たちはあなたのアイデアを現実に変えます。ご質問がある場合は、 お問い合わせ.
- Ruby on Rails での TinyMCE の実装
- アセット パイプライン プラグインについて
- Rails アプリのパフォーマンスを向上させる簡単な方法
- 複数のデータベース接続を使用したアプリケーションのスケーリング