2013-07-02 10 views
6

Fazit: Ich versuche zu verstehen, ob ColdFusion eine persistente HTTP-Verbindung außerhalb einer einzelnen Anfrage über das CFHTTP-Tag nutzen kann. Etwas von diesem Beitrag ist "was habe ich gefunden/versucht."Persistente HTTP-Verbindungen in ColdFusion verstehen

Mein System: CF10 IIS7.5 Windows 7

ich derzeit Einhaken in Elasticsearch über eine HTTP REST-Schnittstelle, die eine Größe von cfhttp Anrufe haben. In diesem Fall ist ColdFusion der Client und ElasticSearch ist der Server. Wie empfohlen, habe ich die Keep-Alive-Header zusammen mit dem cfhttp Anfrage, fand aber die CFHTTP schien immer ein wachsames Recht hinzufügen, nachdem es in diesem Header resultierende:

<!--- Calling tag ---> 
<cfhttp url="loc.mysite.com?endpoint" 
    method="POST" 
    result="ret"> 
<cfhttpparam type="HEADER" name="Keep-Alive" value="300"> 
<cfhttpparam type="HEADER" name="Connection" value="keep-alive"> 
<cfhttpparam type="xml" value="#body#" /> 
</cfhttp> 
<!--- Results in this header. (dumping getHTTPrequestdata() on a dummy page) ---> 
connection: keep-alive,closed 

Erstens kann ich nicht herausfinden, wie zu verhindern das Schließen von auftreten.

Zweitens, ich kann nicht herausfinden, ob ColdFusion die Verbindung wiederverwenden würde, auch wenn es ohne die Schließung während der gleichen Anfrage oder außerhalb dieser Anfrage gesendet wird. Das hat eindeutig damit zu tun, wie Java zu diesem Zeitpunkt mit dem Betriebssystem interagiert. Anfangs dachte ich, es würde von der Magie von ColdFusion gehandhabt werden, aber ich fange an zu denken, dass es keine der ausgefallenen Java-Pooling-Magie verwendet.

Drittens kann ich keine Dokumentation zum HTTP-Verbindungs-Pooling in ColdFusion finden. Es tut gut DB Verbindungspooling, aber HTTP-Pooling ist wahrscheinlich eine relativ neue Anforderung.

Viertens habe ich festgestellt, dass das CFX_http5 in ColdFusion 10 noch mit Tomcat funktioniert (was sind die Chancen). Es ist zwar gut für Multithreading-Anfragen, aber es wird kaum erwähnt, wie Keep-Alive verwendet wird. Ohne es zu kaufen, kann ich es nicht in einer Schleife testen. Es fügt die close-Kopfzeile nicht hinzu. Es sendet weiter so, wie ich es erwarten würde.

Sechste (herausgegeben stark seit dem ersten Veröffentlichung) Sechstens hat Windows die Standard-Anzahl von temporärer oder „ephemeren“ Ports, die es nutzen, um neue ausgehende TCP-Verbindungen laichen zu machen. Wenn eine Verbindung geöffnet wird, wird sie von Windows standardmäßig für zwei Minuten am Leben gehalten (obwohl sie gerade verlassen wird und an dieser Stelle Speicherplatz belegt). Dies ist eine TCP-Konfiguration, so dass http-Header hier nicht direkt spielen. Die Standardanzahl verfügbarer Ports beträgt 5.000 weniger 1024 = 3076 Ports. Das bedeutet, dass alle ColdFusion-Instanzen in einer Box bis zu 3076 HTTP-Anforderungen in einem beliebigen zwei Minuten langen Fenster erstellen können, ohne dass sie an einem verfügbaren Verbindungsport warten müssen. Wenn zu viele Anfragen überflutet werden (ich habe keine Ahnung, an welchem ​​Punkt), erhalten Sie einen "Verbindung geschlossen" -Fehler. Das erinnert mich an die Müllsammlung auf primitiver Ebene. Also, up the Ebene in der Registrierung (siehe post) unten und Sie vermeiden diese Drosseln, aber Sie sind immer noch Verbindungsaufbau/Abbau Verzögerungen und diese Lösung wird nicht skalieren.

aktualisieren: CFX_HTTP5 unterstützt Keepalive und persistente Verbindungen, wie innerhalb einer einzelnen Coldfusion Anforderung erwartet. Mein 150K-Abfragetest für meinen ElasticSearch-Endpunkt wurde zuvor in 15 Minuten ausgeführt. Mit CFX_HTTP5 lief es in 4 Minuten. Außerdem konnte ich die Registrierung auf die Standardanzahl der Ports zurücksetzen. Der nächste Schritt ist herauszufinden, ob HTTPComponents funktionieren wird. Das funktioniert fast.

Update 2:: Erbaut einen benutzerdefinierten HTTP-Aufruf mit den unten vorgeschlagenen HTTP-Komponenten. Ich verwendete einen grundlegenden Verbindungspoolmanager mit Standardeinstellungen. Ich habe noch nicht versucht, es zu tunen. Der Prozess endete in 5 Minuten, was ein wenig langsamer als cfx_http5 ist, aber immer noch viel schneller als cfhttp. Außerdem habe ich keine Tests mit mehreren ColdFusion-Anfragen durchgeführt, um den Verbindungspool wirklich zu testen.

Update 3: Ich verifiziert, dass HTTPComponents in der Tat einen richtigen Verbindungspool aufbaut. Dies ist jedoch mit der Verantwortung verbunden, diese Verbindungen und den Pool selbst ordnungsgemäß zu verwalten, um sicherzustellen, dass die Systemressourcen gut verwaltet werden. Ich konnte mehrere Millionen HTTP-Anfragen von mehreren verschiedenen gleichzeitigen Anfragen ausführen, während ich nur eine Handvoll von HTTP-Verbindungen öffnete. Aus den Protokollen konnte ich sehen, wie viele Verbindungen verwendet wurden, ob sie leer waren oder ob sie in Betrieb waren. Es ist auch nicht so viel Code, die Leute hinter dem Projekt haben großartige Dokumentation.

HTTPComponents Connection Pool: 
Single request, unlimited CFHTTP to same connection = single open TCP connection 
N-requests = <N open TCP connections. 

CFHTTP 
N-CFHTTP calls + N-CFHTTP calls in previous 60 seconds = open TCP connections 

Referenz: Ich fand, dass Java diese zur Verfügung hat, was zeigt, dass es im Bereich des Möglichen ist, aber wer weiß, wie Adobe CFHTTP implementiert hat Persistent Http client connections in java

CFX_http5 benutzerdefinierten Tags C++ verwendet für benutzerdefinierte http Verbindungen, so ist es möglich, dass es Verbindungspooling versteht. http://www.cftagstore.com/tags/cfxhttp5.cfm

Eine verwandte Frage: Maintain Outbound TCP Connection Pool in ColdFusion

über Windows Max Verbindungen/kurzlebige Ports http://kb.globalscape.com/KnowledgebaseArticle10438.aspx

Antwort

2

I 99% sicher bin, dass CFHTTP keine persistenten Verbindungen unterstützt, es ist nur nicht eingerichtet zu beschäftigen damit. Ich denke wirklich, Sie benötigen eine andere API, um sowohl die Verbindung als auch individuelle Anfragen zu bearbeiten. Ich habe CF10 nicht zur Hand, aber CF9 hat eine Version von HTTPClient von 2001, also hoffe ich, dass das CF-Team mit CF10 aktualisiert hat!

Ich würde versuchen, eine Java-basierte HTTP-Bibliothek, wie HTTPClient zu verwenden. Aus der Features-Liste: "Connection-Management-Unterstützung für die Verwendung in Multi-Threaded-Anwendungen. Unterstützt die Einstellung der maximalen Gesamtverbindungen sowie die maximale Anzahl der Verbindungen pro Host. Erkennt und schließt veraltete Verbindungen"

+0

Ausgezeichnete Idee wert sein auf Httpclient . Ich kaufe auch CFX_http5 und gebe dem einen Wirbel. Obwohl es ein paar Jahre alt und verlassen ist, ist das immer noch besser als die Unterstützung, die den eingebauten Tags und Engines im Laufe der Jahre gegeben wurde (Abfrage von Abfragen, Regex, cfhttp, cfpop usw.). Allerdings erhalten wir CFPOD und CFTWITTER! –

+0

Wenn Sie feststellen, dass HTTPClient oder eine andere Lösung funktioniert, können Sie hier posten? Ich bin mir sicher, dass einige Leute sehr an einer Lösung interessiert sind, die dauerhafte HTTP-Verbindungen über CF (oder Java über CF) ermöglicht. Vielen Dank! – Brian

+0

Aktualisiert, dass CFX_HTTP5 funktioniert. Jetzt auf httpcomponents arbeiten. –

0

Etwas, das ich in den letzten Jahren kann Ben Nadel der war CFHTTPSession.cfc

http://www.bennadel.com/projects/cfhttp-session.htm

Das Projekt, das ich nur in Anforderungen an geändert arbeitete als ich entdecken, das so nie, dass ich dazu gekommen, um es tatsächlich versucht, aber vielleicht einen Blick