2012-05-09 8 views
2

私は、Resque、Resque-Status、Resque-Retryを使ってbkgジョブを処理しています。 以下はジョブの例です。 4-5モデルに対してクエリを実行します。 今、私はResqueよりも速いことを誇るSidekiqを試してみたいと思います。Resque performメソッドまたはResque Jobクラスのベンチマーク方法は?

しかしその前に、自分の次の仕事を自分のレールアプリでベンチマークして、後で自分の仕事がベストになることを検証したいと思います。

class BkgJob < Resque::JobWithStatus 
    extend Resque::Plugins::Retry 
    @retry_limit = 3 
    @retry_delay = 60 

    @queue = :critical 

    def perform 
    worker_id, station_id, ids = options['worker_id'], options['station_id'], options['ids'] 
    human_worker = Worker.find(human_worker_id) 
    station = Station.find(station_id) 
    ..... 
    ..... 
    end 
end 

このように、上記のジョブクラスをベンチマークする方法や実行方法は問題ですか?私はベンチマークでは本当に初心者です。

答えて

0

バックグラウンドで実行しているジョブのパフォーマンスは、ResqueまたはSidekiqの場合とほぼ同じです。しかし、Sidekiqは待ち行列からジョブを選ぶ際にはるかに高速であり、Resqueに比べてメモリ効率がはるかに優れています。

バックグラウンドジョブのベンチマークはまだまだ良いアイデアですが、実行方法そのものをベンチマークするだけで、ジョブのキューイングと実行のプロセス全体をベンチマークする必要はありません。このようなことができます(RSpecの例):

require 'benchmark' 

describe 'performance' do 
    it 'takes time' do 
    options = {'worker_id': 123, 'station_id': 456, 'ids': [1,2,3]} 
    puts Benchmark.realtime do 
     100.times { BkgJob.new(options).perform } 
    end 
    end 
end 
+0

返答のためのThanx。しかし、私はまだ仕事の中で起こるDBコールについて心配しています。例えばオプションのハッシュを渡しても、performが呼び出されると、これらのdbコールは 'Station.find(station_id)'と呼ばれます。いくつかのシナリオが十分にクリアされているか、紛失していませ – Autodidact

+0

申し訳ありませんが私は十分に明確ではなかった。 Sidekiqに切り替えると、これらのDBコールはジョブ内では必要ありません。基本的に、ジョブがキューに入れられると、Sidekiqは 'YAML.dump()'で引数をシリアル化し、ジョブが開始すると引数を 'YAML.load()'で逆シリアル化します。 Rubyでは、ActiveRecordオブジェクトを含むすべての属性を持つオブジェクトをYAMLにダンプすることができます。そして、オブジェクトがダンプからロードされると、それはDBへのそれ以上の問い合わせなしに使用する準備が整っています。 – kulesa

+0

あなたのアプリケーションで 'station_dump = YAML.dump(Station.first)'を実行しようとすると 'station = YAML.load(station)'は文字列にダンプしたStationオブジェクトを返します。もちろん、いくつかの注意点があります。たとえば、コールの間にステーションが削除された場合、復元されたステーションオブジェクトにはすべての属性が含まれますが、保存しようとするとエラーが発生します。しかし、これを念頭に置いて、YAMLに対するジョブ引数のシリアライズは、データベースのヒット率を節約し、パフォーマンスを向上させます。 – kulesa

関連する問題