2013-07-02 108 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。 –