У меня есть массив, заполненный потенциально большим количеством записей.Все записи должны быть сохранены сервером в 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 открытым и ускорить свое решение таким образом.
Есть идеи?
С уважением, Феликс