私の Rails 3.2 プロジェクトでは、SuckerPunchを使用して、モデルの作成/更新時に高価なバックグラウンド タスクを実行しています。
ユーザーは、このモデルでさまざまなタイプの対話を行うことができます。ほとんどの場合、これらの更新は十分な間隔で行われますが、並べ替えや一括更新などの他のアクションでは、これらの POST 要求が非常に頻繁に受信される可能性があり、そのときにサーバーが圧倒されます。
私の質問は、最初の更新が発生したときにバックグラウンド ジョブを開始するための最もエレガントでスマートな戦略は何かということですが、たとえば10 秒待って、そのモデル (行ではなくテーブル) に更新が来ていないことを確認してから、ジョブを実行します。したがって、キューに入れずに効果的にスロットリングします。
私のsucker_punch
ワーカーは次のようになります。
class StaticMapWorker
include SuckerPunch::Job
workers 10
def perform(map,markers)
#perform some expensive job
end
end
Marker
「マップ」モデルから呼び出され、update_all
場合によっては次のようにコントローラーから呼び出されます。
after_save :generate_static_map_html
def generate_static_map_html
StaticMapWorker.new.async.perform(self.map, self.map.markers)
end
したがって、バックグラウンド ジョブを実行するためのかなり標準的なセットアップです。x seconds
モデル (またはテーブル)の更新がなくなるまで、ジョブを待機させるかスケジュールしないようにするにはどうすればよいですか?
それが役立つ場合、Map has_many
Markersはロジックを使用してジョブをトリガーするため、マップ更新のマーカーの関連付けも問題ありません。