2012-05-09 3 views
2

bkg 작업을 처리하기 위해 Resque, Resque-Status 및 Resque-Retry를 사용하고 있습니다. 다음은 작업 예입니다. 4-5 모델에 대한 쿼리를 수행합니다. 이제 Resque보다 빠른 속도를 자랑하는 Sidekiq을 사용하려고합니다.Resque 수행 메소드 또는 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

고맙습니다. 하지만 저는 여전히 직장 내부에서 발생할 DB 호출에 대해 우려하고 있습니다. 예 : 옵션 해시를 전달했지만 perform이 호출되면 해당 db 호출은 여전히 ​​'Station.find (station_id)'라고합니다. 일부 시나리오가 불확실하거나 누락되어 있습니까? – Autodidact

+0

죄송 합니다만 충분히 명확하지 않았습니다. Sidekiq로 전환하면 이러한 DB 호출이 필요하지 않을 것입니다. 기본적으로 작업이 대기 상태가되면 Sidekiq는'YAML.dump()'로 인수를 직렬화하고 작업이 시작되면 'YAML.load()'를 사용하여 인수를 deserialize합니다. Ruby에서 ActiveRecord 객체를 포함한 모든 속성을 가진 객체를 YAML에 덤프 할 수 있습니다. 그리고 객체가 덤프에서로드 될 때, DB에 추가 질의없이 객체를 사용할 준비가되었습니다. – kulesa

+0

응용 프로그램에서'station_dump = YAML.dump (Station.first)'를 실행하면'station = YAML.load (station)'이 문자열에 덤프 한 것과 같은 Station 객체를 제공합니다. 물론 몇 가지주의 사항이 있습니다. 예를 들어 호출간에 스테이션이 삭제 된 경우 복원 된 스테이션 개체는 모든 특성을 갖지만 저장하려고하면 오류가 발생합니다. 그러나이를 염두에두고 YAML에 대한 작업 인수를 직렬화하면 데이터베이스 히트가 절약되고 성능이 약간 향상됩니다. – kulesa

관련 문제