1

私の 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はロジックを使用してジョブをトリガーするため、マップ更新のマーカーの関連付けも問題ありません。

4

1 に答える 1