4

我有大约 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 实例推送到一个数组中,然后使用Parallelgem 遍历它们。例如:

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
4

0 回答 0