潜在的に多くのレコードが配列された配列があります。すべてのレコードは、サーバーによってRESTfulRecordsControllerに保存されます。現時点での私のソリューションは次のようになります。
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クライアントを1回だけインスタンス化し、同じ接続を使用してすべてのレコードを送信することが役立つかどうかです。私はそれを実装するための解決策を見つけられませんでした。なぜなら、ここにあるコードのsave_or_storeの振る舞いが必要だからです。
別の解決策は、次々に行われるレコードを転送するのではなく、それらをグループ化し、レコードのグループを受け入れてそれらを格納する新しいコントローラーを作成することです。
したがって、この質問は、技術的な質問よりもアーキテクチャ的な質問に要約されます。いずれにせよ、HTTP接続を開いたままにして、その方法でソリューションを高速化できるかどうか疑問に思います。
何か案は?
よろしくフェリックス