执行大约200万并行请求Typhoeus

时间:2018-02-07 05:44:25

标签: ruby-on-rails typhoeus

我有大约260万条记录需要通过外部请求进行外部更新(使用PUT)。这只是一次性的事情,所以我有以下几点:

@hydra ||= Typhoeus::Hydra.hydra
million_records.each do |id|
  typhoeus_request = Typhoeus::Request.new(
    url: "http://localhost:300/posts/#{id}" 
    headers: {'content-type' => 'application/json'},
    params: {field1: 'Hello World'}
    method: :put
  )
  @hydra.queue typhoeus_request
end
@hydra.run

我阅读了有关并行请求的文档,并指出:

  

Hydra还将处理您可以并行处理的请求数量。如果你试图在同一时间提出太多请求,事情就会变得松懈。内置限制为200.当比这更多的请求排队时,hydra将保存它们以供日后使用,并在其他请求完成时启动请求。

我的问题是,上述有任何性能缺陷吗?如果是这样,我怎样才能改进上述内容,使其更具性能。

或者另外一个建议是,对于每次迭代,创建一个新的hyrda实例队列并将hydra实例推入一个数组,然后使用Parallel gem进行遍历。例如:

batches = []

million_records.each do |id|
  hydra ||= Typhoeus::Hydra.hydra
  typhoeus_request = Typhoeus::Request.new(
    url: "http://localhost:300/posts/#{id}",
    params: {field1: 'Hello World'},
    headers: {'content-type' => 'application/json'},
    method: :put
  )
  hydra.queue typhoeus_request
  batches.push(hydra)
end

Parallel.each(batches, in_threads: 5) do |batch|
  batch.run
end

0 个答案:

没有答案