2013-07-02 107 views
6

底線:我想了解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

回答

2

我99%肯定CFHTTP不支持持久連接,它只是沒有設置處理用它。我想你真的需要一個不同的API來處理連接和個人請求。我沒有得到CF10,但CF9從2001年開始有HTTPClient的版本,所以我希望CF團隊能夠更新CF10!

我希望使用基於Java的HTTP庫,例如HTTPClient。從功能列表:「連接管理支持用於多線程應用程序支持設置最大總連接數以及每臺主機的最大連接數檢測並關閉過時連接」

+0

很好的想法上的項目了HTTPClient 。我也要購買CFX_http5並給它一個旋轉。雖然它已經過了幾年而被拋棄,但它仍然比多年來對內置標籤和引擎的支持要好(Query of Queries,regex,cfhttp,cfpop等)。然而,我們確實獲得了CFPOD和CFTWITTER! –

+0

如果您發現HTTPClient或其他解決方案有效,您可以在這裏發帖嗎?我相信許多人會對通過CF(或Java通過CF)進行持久HTTP連接的解決方案非常感興趣。謝謝! – Brian

+0

更新了CFX_HTTP5的工作原理。現在正在處理httpcomponents。 –