2013-11-15 6 views
0

백그라운드 작업을 처리하기 위해 Sidekiq을 사용했지만 특정 용도에 맞게 너무 제한적입니다.사용자 별 대기열을 사용한 백그라운드 처리?

사용자가 계정을 만들면 타사 서비스에서 데이터를 가져옵니다. 이 서비스는 속도 제한이있어서 수입을 높이기 위해 수십 명의 직원을 투입 할 수 있습니다.

사이드 킥으로 세분화 된 작업자 수를 제어 할 수 없다는 것이 문제입니다.

대기열 당 작업자 수를 제한 할 수는 있지만 여기서 도움이되지 않습니다.

예를 들어, 10 명이 계정을 만들면 모든 10 명의 모든 데이터의 전체 가져 오기를 제한해야하지만 실제로 필요한 것은 개별 계정의 속도를 제한하는 것입니다.

실제적으로 사용자 별 대기열을 생성 한 다음 대기열 당 작업자 수를 제한하는 것이 트릭을 수행 할 수 있습니다.

작업자 수를보다 세부적으로 제어 할 수있는 Sidekiq과 같은 것이 있습니까?

답변

0

외부 서비스 DDoSing을 방지하기 위해 속도 제한을 스스로 부과 할 필요가있는 비슷한 상황이 있습니다. 사이드 키 작업의 대기열을 제어하기 위해 Sidetiq을 사용했습니다.

사이드 키 (Sidetiq)를 사용하면 주기적으로 사이드킥 작업을 대기시킬 수 있습니다. 예를 들어 매시간 Sidekq에 10 개의 사용자 가져 오기 작업을 추가하는 Sidetiq 작업을 만들 수 있습니다.

class UserJobScheduler 
    include Sidekiq::Worker 
    include Sidetiq::Schedulable 

    recurrence { hourly.minute_of_hour(0) } 

    sidekiq_options queue: :default 

    def perform 
    # find 10 unprocessed user ids, then queue them up 
    User.where(unprocessed: true).limit(10).pluck(:id).each do |user_id| 
     UserDataImporter.perform_async(user_id) 
    end 
    end 
end 

class UserDataImporter 
    include Sidekiq::Worker 

    sidekiq_options queue: :user_import, retry: false 

    def perform(user_id) 
    # import user data & mark as processed 
    end 
end 

실제로 속도 제한이 필요한 API를 호출 한 클래스에서 retry를 false로 설정했습니다. 이를 통해 전송되는 요청 수를보다 정확하게 제어 할 수 있습니다. 그렇지 않으면 실패한 요청이 사용자가 호출하는 서비스에 대해 너무 공격적 일 수있는 Sidekiqs 재시도 일정을 따릅니다.

그런 다음 UserJobScheduler에서 실행 당 추가 된 작업 수와 Sidekiq 대기열에 추가되는 빈도를 조정할 수 있습니다 반복 설정이 호출중인 API의 속도 제한보다 낮게 설정됩니다.