底線:我想了解ColdFusion是否能夠通過CFHTTP標記在單個請求之外使用持久http連接。這篇文章的一些內容是「我發現/嘗試了什麼」。瞭解ColdFusion中的持久HTTP連接
我的系統: CF10 IIS7.5 Windows 7的
我目前掛鉤到ElasticSearch通過HTTP REST接口,這將有CFHTTP呼叫的幅度。在這種情況下,ColdFusion是客戶端,ElasticSearch是服務器。至於建議,我通過這些保活頭與CFHTTP請求一起,卻發現CFHTTP似乎總是它造成這個頭之後添加了密切的權利:
<!--- 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
首先,我無法弄清楚如何預防結束髮生。
其次,我不能確定ColdFusion是否會重新使用連接,即使它在相同請求期間或在此請求之外發送時沒有關閉。顯然,這與Java在此時如何與操作系統進行交互有關。最初,我認爲這將由ColdFusion的魔力來處理,但是我開始認爲它沒有使用任何幻想的Java池化魔法。
第三,我在ColdFusion中找不到關於http連接池的任何文檔。它確實有DB連接池,但是http池可能是一個相對較新的需求。第四,我發現CFX_http5仍然在使用Tomcat的ColdFusion 10中工作(有什麼機會)。雖然它擅長多線程請求,但幾乎沒有提到如何使用保持活動。如果不購買它,我無法在循環內測試它。它不會添加關閉標題。它發送保持活着,如我所料。
第六個(自初始發佈後大量編輯) 第六,Windows有一個默認數量的臨時或「臨時」端口,可用於產生新的出站TCP連接。默認情況下,一旦連接打開,Windows將保持活動狀態兩分鐘(儘管它剛剛被放棄並佔用了空間)。這是一個TCP配置,所以http頭不直接在這裏播放。可用端口的默認數量是少於5,000個1024 = 3076個端口。這意味着一個盒子上的所有ColdFusion實例在任何給定的兩分鐘窗口內最多可以組成3076個http請求,而不會在可用連接端口上等待。如果太多請求被淹沒(我不知道在什麼時候),您將收到「連接關閉」錯誤。這讓我想起了原始級別的垃圾收集。所以,在註冊表中的級別(見後),你避免這些扼流圈,但你仍然遇到連接建立/拆卸延遲,這種解決方案不會擴展。
更新:CFX_HTTP5在單個ColdFusion請求中確實支持保持活動和持久連接。我的ElasticSearch端點的我的150K查詢測試以前在15分鐘內運行。使用CFX_HTTP5,它在4分鐘內運行。另外,我能夠將註冊表切換回默認的端口數量。下一步是弄清楚HTTPComponents是否可以工作。我有這幾乎工作。
更新2::使用下面建議的HTTP組件創建自定義http調用。我使用了默認設置的基本連接池管理器。我還沒有試圖調整它。該過程在5分鐘內完成,比cfx_http5慢了一點,但仍比cfhttp快很多。另外,我還沒有完成涉及多個ColdFusion請求的測試來真正測試連接池。
更新3:我驗證了HTTPComponents確實設置了正確的連接池。然而,由此帶來的責任是恰當地管理這些連接和池本身,以確保它是系統資源的良好管理者。我能夠從幾個不同的同時請求中運行數百萬個HTTP請求,同時只打開一小撮HTTP連接。從日誌中,我可以看到正在使用,閒置或啓動的連接數。這實際上並不是那麼多的代碼,項目背後的人都有很好的文檔。
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
參考: 我確實發現Java有此可用的,這表明它在有可能的,但誰知道Adobe已經實現CFHTTP Persistent Http client connections in java
CFX_http5自定義標籤使用C++進行自定義http連接,所以它可能理解連接池。 http://www.cftagstore.com/tags/cfxhttp5.cfm
一個相關的問題: Maintain Outbound TCP Connection Pool in ColdFusion
關於Windows最大連接數/臨時端口 http://kb.globalscape.com/KnowledgebaseArticle10438.aspx
很好的想法上的項目了HTTPClient 。我也要購買CFX_http5並給它一個旋轉。雖然它已經過了幾年而被拋棄,但它仍然比多年來對內置標籤和引擎的支持要好(Query of Queries,regex,cfhttp,cfpop等)。然而,我們確實獲得了CFPOD和CFTWITTER! –
如果您發現HTTPClient或其他解決方案有效,您可以在這裏發帖嗎?我相信許多人會對通過CF(或Java通過CF)進行持久HTTP連接的解決方案非常感興趣。謝謝! – Brian
更新了CFX_HTTP5的工作原理。現在正在處理httpcomponents。 –