インフラストラクチャにResqueサーバーの「クラスター」があります。それらはすべて同じ正確なジョブの優先順位などを持っています。保留中のジョブの数と、サーバー上でそれらのジョブを処理するために使用可能なリソースに基づいて、Resqueサーバーの数を自動的に増減します。私は常に最低2台のResqueサーバーを稼働させています。
私の問題は、1回限りの迅速なジョブを実行すると、両方のサーバーがそのジョブを処理することがあるということです。これは悪いです。
次のようなものを使用して、自分の仕事にロックを追加しようとしました。
require 'resque-lock-timeout'
class ExampleJob
extend Resque::Plugins::LockTimeout
def self.perform
# some code
end
end
このプラグインは、実行時間の長いジョブで機能します。ただし、これらの非常に小さな1回限りのジョブの場合、処理はすぐに行われます。Resqueサーバーは両方とも、姉妹サーバーによって設定されたロックを認識せず、両方ともロックを設定し、ジョブを処理し、ロックを解除して、完了します。
このタイプのジョブを1つの専用サーバーで処理することを除いて、現時点で何をすべきか、またはどのような解決策があるのか完全にはわかりません。これは、構成とスケーリングが非常に困難です。私は本当に両方のサーバーがそれを処理できるようにしたいのですが、一方がキューからそれを取得したら、もう一方がそれを実行しないようにしてください。
誰かがいくつかの実行可能な解決策を提案できますか?