2013-07-02 17 views
6

Bottom Line: Sto cercando di capire se ColdFusion è in grado di utilizzare una connessione http persistente al di fuori di una singola richiesta tramite il tag CFHTTP. Alcuni di questo post sono "cosa ho trovato/provato".Informazioni sulle connessioni HTTP persistenti in ColdFusion

Il mio sistema: CF10 IIS7.5 Windows 7

Attualmente sto vadano in elasticsearch tramite un'interfaccia HTTP Riposo che avrà una magnitudo di chiamate cfhttp. In questo caso, ColdFusion è il client e ElasticSearch è il server. Come raccomandato, ho superato l'intestazione keep-alive insieme alla richiesta cfhttp, ma ha trovato il cfhttp sembrava di aggiungere sempre una stretta subito dopo con conseguente questa intestazione:

<!--- 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 

primo luogo, non riesco a capire come prevenire la chiusura dal verificarsi.

In secondo luogo, non riesco a capire se ColdFusion possa riutilizzare la connessione, anche se viene inviata senza la chiusura durante la stessa richiesta o al di fuori di questa richiesta. Chiaramente questo ha a che fare con il modo in cui Java sta interagendo con il sistema operativo a questo punto. Inizialmente, pensavo che sarebbe stato gestito dalla magia di ColdFusion, ma sto cominciando a pensare che non stia usando nessuna delle fantasiose tecniche di Java.

In terzo luogo, non riesco a trovare alcuna documentazione sul pool di connessioni http in ColdFusion. Fa il pool di connessioni DB bene, ma il pooling http è probabilmente un requisito relativamente nuovo.

In quarto luogo, ho trovato che CFX_http5 funziona ancora in ColdFusion 10 con Tomcat (quali sono le possibilità). Mentre è buono alle richieste di multithreading, non si fa menzione di come viene usato il keep-alive. Senza acquistarlo, non posso testarlo all'interno di un ciclo. Non aggiunge l'intestazione chiusa. Invia mantiene vivo come mi aspetterei.

Sesto (modificato dal primo post) Sesto, Windows ha un numero predefinito di porte temporanee o "effimere" che può utilizzare per generare nuove connessioni TCP in uscita. Per impostazione predefinita, una volta aperta una connessione, Windows la manterrà attiva per due minuti (anche se è appena stata abbandonata e occupa spazio a questo punto). Questa è una configurazione TCP, quindi le intestazioni http non sono direttamente in gioco qui. Il numero predefinito di porte disponibili è 5.000 in meno 1024 = 3076 porte. Ciò significa che tutte le istanze di ColdFusion su una casella potrebbero creare fino a 3076 richieste HTTP in una finestra dei due minuti senza essere soffocati in attesa su una porta di connessione disponibile. Se troppe richieste sono inondate (non ho idea in quale momento), riceverai un errore "connessione chiusa". Questo mi ricorda la raccolta dei rifiuti a livello primitivo. Quindi, il livello del registro (vedi post) di seguito e si evitano queste strozzature, ma si verificano ancora i ritardi di configurazione/interruzione della connessione e questa soluzione non si ridimensionerà.

Aggiornamento: CFX_HTTP5 supporta connessioni keep-alive e persistenti come previsto entro una singola richiesta ColdFusion. Il mio test di query 150K sul mio endpoint ElasticSearch è stato eseguito in precedenza in 15 minuti. Con CFX_HTTP5, ha funzionato in 4 minuti. Inoltre, sono stato in grado di riportare il registro al numero di porte predefinito. Il prossimo passo è capire se HTTPComponents funzionerà. Ho quasi funzionato.

Aggiornamento 2:: Creazione di una chiamata http personalizzata utilizzando i componenti HTTP proposti di seguito. Ho usato un gestore di pool di connessione di base con le impostazioni predefinite. Non ho ancora provato a sintonizzarlo. Il processo è terminato in 5 minuti, un po 'più lento di cfx_http5, ma molto più veloce di cfhttp. Inoltre, non ho eseguito test che coinvolgessero più richieste ColdFusion per testare realmente il pool di connessioni.

Aggiornamento 3: Ho verificato che HTTPComponents sta effettivamente configurando un pool di connessioni corretto. Tuttavia, con questo viene la responsabilità di gestire correttamente tali connessioni e il pool stesso per garantire che sia un buon amministratore delle risorse di sistema. Sono stato in grado di eseguire diverse milioni di richieste HTTP da diverse richieste simultanee aprendo solo una manciata di connessioni HTTP. Dai log, sono stato in grado di vedere quante connessioni sono state utilizzate, inutilizzate o spun-up. Non è nemmeno tanto il codice, le persone dietro il progetto hanno una grande documentazione.

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 

Riferimento: ho trovato che Java ha questa disposizione, il che dimostra che è nel regno delle possibilità, ma che sa come Adobe ha implementato cfhttp Persistent Http client connections in java

tag personalizzato CFX_http5 usa C++ per la personalizzazione connessioni http, quindi è possibile che comprenda il pool di connessioni. http://www.cftagstore.com/tags/cfxhttp5.cfm

Una questione collegata: Maintain Outbound TCP Connection Pool in ColdFusion

Informazioni sui collegamenti di Windows Max/porte effimere http://kb.globalscape.com/KnowledgebaseArticle10438.aspx

risposta

2

Sono al 99% sicuro che cfhttp non supporta le connessioni persistenti, è solo che non impostato per affrontare con esso. Penso che in realtà avrai bisogno di un'API diversa per gestire sia la connessione che le singole richieste. Non ho CF10 a portata di mano, ma CF9 ha una versione di HTTPClient del 2001, quindi spero che il team CF sia aggiornato con CF10!

Vorrei utilizzare una libreria HTTP basata su Java, ad esempio HTTPClient. Dall'elenco delle caratteristiche: "Supporto per la gestione delle connessioni da utilizzare in applicazioni multi-threaded Supporta l'impostazione delle connessioni totali massime e delle connessioni massime per host. Rileva e chiude le connessioni stanti"

+0

Ottima idea su HTTPClient . Ho intenzione di acquistare CFX_http5 e dare un vortice. Anche se ha pochi anni e viene abbandonato, è ancora meglio di un po 'del supporto dato ai tag e ai motori integrati nel corso degli anni (Query of Queries, regex, cfhttp, cfpop, ecc.) Tuttavia, otteniamo CFPOD e CFTWITTER! –

+0

Se trovi che HTTPClient o un'altra soluzione funziona, puoi pubblicare qui? Sono sicuro che un numero di persone sarebbe molto interessato a una soluzione che permetta connessioni HTTP persistenti via CF (o Java via CF). Grazie! – Brian

+0

Aggiornato che CFX_HTTP5 funziona. Lavorare su httpcomponents ora. –

0

Qualcosa che posso fare in pochi anni indietro era di Ben Nadel CFHTTPSession.cfc

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

Il progetto ho lavorato su cambiato in esigenze proprio come ho scoperto questo quindi non ho mai avuto intorno a provare in realtà, ma forse vale la pena dare un'occhiata

Problemi correlati