2016-08-01 12 views
1

Ich habe einen Verbraucher für eine Zahlung API geschrieben. Mein Code gibt einfach eine POST-Anfrage aus und erhält eine Antwort von der API. Ich habe mit Net implementiert, dass :: HTTP, hier den entsprechenden Codezeilen sind:Net :: HTTP - Flush oder Schließen

http = Net::HTTP.new(uri.host, 443) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Post.new(uri.request_uri) 
request.set_form_data(params) 
response = http.request(request) 

Diese seit Jahren gearbeitet, aber in letzter Zeit einige Anfragen Timeouts haben erreicht, wenn der API unter Stress. Der API-Betreuer kam mit dieser Erklärung:

Wir übergeben die Daten an RabbitMQ synchron nach dem Löschen der HTTP-Antwort. Offenbar warten einige HTTP-Bibliotheken darauf, dass die Verbindung geschlossen wird, bevor das Programm auf der Verbraucherseite fortgesetzt wird, und wir denken, dass dies hier geschieht. Bitte konfigurieren Sie Ihren Benutzer neu, damit er nicht auf den Abschluss wartet, sondern direkt nach dem Zurücksetzen der Antwort fortfährt.

Ich bin mir nicht sicher, wie Net :: HTTP implementiert ist und ob es wirklich auf das Schließen wartet, wenn die Antwort gelöscht wurde. Die Dokumentation sagt nichts darüber, noch gibt es eine Einstellung, um dies zu kontrollieren. Und um das Ganze noch schlimmer zu machen, weiß ich nicht, wie ich das simulieren soll.

Alle Ideen sind sehr willkommen!

Antwort

0

Ich denke, das folgende Experiment (mit Ruby 2.3) sollte die Antwort geben, poste ich es hier für den Fall, dass jemand anderes über diese Frage in der Zukunft stolpert.

server.rb:

require 'socket' 

server = TCPServer.new('localhost', 2345) 
loop do 
    socket = server.accept 
    request = socket.gets 
    STDERR.puts request 
    response = "Hello World at #{Time.now}!\n" 
    socket.print "HTTP/1.1 200 OK\r\n" + 
       "Content-Type: text/plain\r\n" + 
       "Content-Length: #{response.bytesize}\r\n" + 
       "Connection: close\r\n" 
    socket.print "\r\n" 
    socket.print response 
    socket.flush 
    sleep 10 
    socket.close 
end 

client.rb:

require 'net/http' 

http = Net::HTTP.new('localhost', 2345) 
request = Net::HTTP::Post.new('/') 
response = http.request(request) 
puts response.body 

Ausführen des Servers, wird der Client eine Anfrage und Ausgang senden. Dies geschieht sofort, so dass der Flush ausreicht, um den Client-Code fortsetzen zu lassen. Neustart des Clients innerhalb der 10 Sekunden warten auf den Server, verursacht den Client den Hang, bis die 10 Sekunden vollständig abgelaufen sind, dann Drucken der Hello World und noch einmal sofort beendet.

Mit anderen Worten: Solch ein einfacher Net::HTTP Client wartet nicht auf die Verbindung zu schließen, aber weiterhin den Code ausgeführt, sobald der Server geleert hat.