1

我有一个外部 REST API,它处理在“数据存储”中存储数据。

在文件上传时,它们是一个 Ruby 库,它调用此 API 并将数据数组传递给它,然后由外部 API 将其存储在数据库中。

我尝试将小块数组传递给 API,以限制任何 curl 调用中的帖子正文内容长度。

库调用看起来像这样

def add_data(table_name, table_data)

  url    =  "#{ExternalAPI::URL}/addData"
  m_curl = Curl::Multi.new

  begin

    chunks = table_data.each_slice(ExternalAPI::BATCH_SIZE).to_a

    chunks.each do |data_chunk|

      data = {
          "tableName" => table_name,
          "data"      => data_chunk
      }.to_json

      curl = Curl::Easy.new(url)
      curl.headers = {}
      curl.headers['Content-type'] = 'text/plain'
      curl.timeout = 300
      curl.post_body = data
      m_curl.add(curl)
    end

    m_curl.perform
    true

  rescue Exception => e
    puts "Curl Failed #{e.message}"
    puts "#{e.backtrace}"
    Rails.logger.error "Curl Failed #{e.message}"
    return false
  end

end

这会导致 Webrick 在开发模式下打开连接过多错误。我假设Multi::Curl要么回收连接,但我不确定这是否在内部发生。

我还尝试在循环中创建一个新的 curl 连接并在for循环结束时将其关闭(我知道它效率低下),但它仍然导致了同样的错误。

任何人都可以对此有所了解吗?

4

1 回答 1

0

我认为Multi::Curl将尝试同时执行所有连接。您可能需要将它们分成更小的组。

于 2013-10-10T05:02:42.917 回答