「データストア」へのデータの保存を処理する外部 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
ループの最後で閉じようとしましたが (効率が悪いことはわかっています)、それでも同じエラーが発生しました。
誰でもこれに光を当てることができますか?