我有一个填充了可能有很多记录的数组。每条记录都应由服务器保存在 RESTful RecordsController 中。我目前的解决方案如下所示:
def self.send! options = nil
records = fetch_records
records.each do |r|
send_data!(r) ? records = records.delete_if{|rec| rec == r } : break
end
storage.save! records
true
end
private
def self.send_data! record, options = nil
begin
response = Net::HTTP.Proxy(configuration.proxy_host, configuration.proxy_port).start(configuration.host, configuration.port) do |http|
request = Net::HTTP::Post.new(request_path options)
request.body = record.to_json
http.request request
end
raise StandardError unless response.code == "200"
rescue Exception => e
return false
end
true
end
该解决方案的优点是,如果发生 ConnectionError、ConnectionTimeout 或 ServerError,未发送的记录将存储在本地,以后可以再次提交。匹配的控制器是一个标准的 Rails 控制器。
我现在的问题是,在生产模式下这似乎很慢。服务器不是瓶颈的地方大约是 4 个请求/秒。
现在的问题是,它是否有助于只实例化 HTTP 客户端一次并使用同一连接发送所有记录。我没有找到实现它的解决方案,因为我需要这里代码的 save_or_store 行为。
另一种解决方案可能不是一个接一个地传输完成的记录,而是将它们分组并创建一个新的控制器,该控制器接受我的记录组来存储它们。
所以这个问题归结为一个更具架构性的问题,而不是技术问题。无论哪种方式,我都想知道我是否可以保持 HTTP 连接打开并以这种方式加速我的解决方案。
有任何想法吗?
问候菲利克斯