-1

質問への回答を投稿するような RoR アプリケーションがあります。ユーザーが質問に回答すると、その質問を監視リストに登録したすべてのユーザー、質問を追跡しているすべてのユーザー、および質問の所有者に通知メッセージが送信されます。通知メッセージの作成に遅延ジョブを使用しています。そのため、回答を作成している間、遅延ジョブテーブルへの挿入が多く発生しているため、ページの読み込みが遅くなります。回答が作成された後、質問の表示ページにリダイレクトされるまでに時間がかかります。

現在、AJAX リクエストを使用して回答テーブルに挿入しています。AJAXリクエストが完了した後、バックグラウンドで遅延ジョブテーブルに挿入する方法はありますか?

4

3 に答える 3

3

私たちがコメントで言おうとしてきたように:

次のようなものがあるようです:

User.all.each do |user|
  user.delay.some_long_operation
end

これにより、delayed_jobs に多くの行が挿入されます。私たちが提案しているのは、そのコードを遅延ジョブ自体にリファクタリングすることです。

def delayed_operation
  User.all.each do |user|
    user.some_long_operation
  end
end

self.delay.delayed_operation

明らかに、それを適応させる必要があり、おそらくdelayed_operationモデルライブラリのどこかに、おそらくクラスメソッドとして配置する必要があります...しかし、ポイントはdelay呼び出しを大きなクエリの外に置いてループすることです.

于 2012-08-17T15:08:52.703 に答える
0

現在持っている電子メールジョブに加えて、これらのジョブの作成を処理する別のタイプのジョブを発明します。

def email_all
  User.all.each do |user|
    user.delay.email_one()
  end
end

def email_one
  # do the emailing
end

self.delay.email_all()

このように、ユーザーアクションは、応答が表示される前に1つの挿入のみをトリガーします。個々のジョブを追跡することもできます。

于 2012-09-19T06:42:32.153 に答える
0

これを別のプロセスで行うことを本当にお勧めします。ユーザーがこれらのメタアクションを待たなければならないのはなぜですか? 結果ページの配信に固執し、サーバーに何かをしなければならないことを通知するだけです。

別のモデル PostponedAction を作成して、'to-do' アクションのリストを作成します。回答を投稿する場合は、回答 ID のパラメーターを使用して、このデータベースに 1 つの PostponedAction を追加します。次に、結果をユーザーに返します。

別のプロセス (cron ジョブ) を使用して、PostponedAction アイテムを読み取り、それらを処理します。それらを「処理済み」としてマークするか、処理が成功したら削除します。このようにして、ユーザーは低速のサーバー プロセスに悩まされることはありません。

于 2012-08-17T12:32:00.857 に答える