2011-08-10 11 views
0

Ruby 1.9.2を使用して、180,000以上のデータ行を取得するには、Webサービスへの呼び出しをたくさん行う必要があります。Webサービスへのバッチコールの作成と進行状況の保存

結果の総量を知る方法はありません。1日に150,000行、来週に200,000件になる可能性があるので、結果がゼロになるまでこれらの呼び出しをすべて一括して行う必要があります。

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回の再試行後にあきらめると言いましょう。しかし、その時点ですべてを終了して失敗試行を記録するか、それを処理したいとします。

関連する問題