2011-08-10 2 views
0

Ruby 1.9.2를 사용하여 180,000 개가 넘는 데이터 행을 얻으려면 웹 서비스를 많이 호출해야합니다.웹 서비스에 일괄 처리 호출 및 진행 저장

결과의 총 수를 알 수있는 방법이 없습니다. 하루에 150,000 개의 행과 다음 주에 200,000 개의 행이있을 수 있으므로 결과가 0이 될 때까지 모든 호출을 일괄 적으로 수행해야합니다.

limit = 1000 
offset = 0 

@data = @client.get_data :limit => limit, :offset => offset 

until @data.length.zero? 
    # save @data to database 
    offset += limit 
    @data = @client.get_data :limit => limit, :offset => offset 
end 

하지만 난을 여러 스레드를 가지고 싶습니다

는 지금은 (난 그냥 목적을 보여주는 이런 식으로 넣어, 물론 이것은 실제 코드가 아닌) 이런 일이 통화가 끝나면 데이터 손실을 피하기 위해 진행 상황을 저장하고 진행 상황을 저장하고 동일한 매개 변수로 통화를 재 시도하십시오.

여기서 중요한 문제는 내가 얻을 수있는 행의 총량을 알 수 없다는 것입니다. 두 경우 모두 Resque와 같은 것을 사용하고 모든 데이터를 얻기 위해 필요한 작업을 정의 하겠지만 사실이 아니라면 결과가 나올 때까지 오프셋 값을 늘려야합니다.

제안 사항?

답변

0

나는 당신이 무슨 뜻인지 정확히 모르겠다. 그러나 얼마나 많은 총 데이터가 있는지 알 수 없기 때문에 은 여전히 ​​스레드를 사용하고 싶다. 스레드가 필요하면 옵션을 사용할 수 없다는 것을 알 수있다.

왜 스레드 풀 같은 것을 사용하지 :
https://github.com/fizx/thread_pool

그런 다음 바로 풀의 스레드를 통해 루프, 그리고 새로운이 "가능"오프셋의 목록에서 오프셋 각각 할당합니다. 이런 식으로 뭔가가 :

next_offset = 0 

while @available_data { 
    pool.execute(next_offset) { |offset| 
    # Get data 
    @data[offset] = @client.get_data ... 

    # Check if we got to the end 
    @available_data = false if @data[offset].length.zero? 
    } 

    next_offset += limit 
} 

# Wait for all threads to finish 
pool.join 

# Consolidate your data 
@data.keys.sort.each { |offset| 
    # Whatever you do to gather the data from all threads into one place... 
    @all_data += @data[offset] 
} 

는 그런 다음 get_data 내부적으로 자동으로 예외 실패와 재 시도를 처리

. 그런 식으로 get_data은 오프셋에 대한 데이터가 무엇이든 상관없이 반환된다는 것을 보장합니다.

물론 "불가항력"오류 검사를 추가해야합니다. 100 회 재시도 후 포기한다고 가정 해 봅시다. 그러나 그 시점에서 모든 것을 종료하고 실패 시도를 기록하거나 처리하려고합니다.