1

「データストア」へのデータの保存を処理する外部 REST API があります。

ファイルのアップロードでは、この API を呼び出してデータ配列を渡す Ruby ライブラリが、外部 API によってデータベースに格納されます。

curl 呼び出しで投稿本文のコンテンツの長さを制限するために、配列の小さなチャンクを API に渡そうとします。

ライブラリ呼び出しは次のようになります

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しましたが、それが内部で発生するかどうかはわかりません。

また、ループ内に新しいカール接続を作成し、forループの最後で閉じようとしましたが (効率が悪いことはわかっています)、それでも同じエラーが発生しました。

誰でもこれに光を当てることができますか?

4

1 に答える 1