了解ColdFusion中的持久HTTP连接

时间:2013-07-02 19:25:45

标签: http coldfusion

结论:我试图了解ColdFusion是否能够通过CFHTTP标记在单个请求之外使用持久性http连接。这篇文章的一部分是“我发现/尝试了什么”。

我的系统: CF10 IIS7.5 Windows 7

我目前正在通过HTTP Rest接口连接到ElasticSearch,该接口将具有大量的cfhttp调用。在这种情况下,ColdFusion是Client,ElasticSearch是服务器。按照建议,我将keep-alive标头与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在这一点上与OS的交互方式有关。最初,我认为它将由ColdFusion的魔力处理,但我开始认为它没有使用任何奇特的Java池化魔法。

第三,我在ColdFusion中找不到关于http连接池的任何文档。它确实可以很好地进行数据库连接池,但是http池可能是一个相对较新的要求。

第四,我发现CFX_http5仍然在使用Tomcat的ColdFusion 10中工作(有什么机会)。虽然它擅长多线程请求,但很少提及如何使用keep-alive。没有购买,我无法在循环内测试它。它不会添加关闭标头。它像我期望的那样发送活着。

第六名(自首发以来编辑很多) 第六,Windows有一个默认数量的临时或“短暂”端口,它可以利用它来产生新的出站TCP连接。默认情况下,一旦打开一个连接,Windows将使其保持活动状态两分钟(尽管它刚刚被放弃并占用了空间)。这是一个TCP配置,因此http标头不会直接在这里播放。可用端口的默认数量为5,000个,减去1024个= 3076个端口。这意味着一个盒子上的所有ColdFusion实例在任何给定的两分钟窗口中最多可以产生3076个http请求,而不会在可用的连接端口上等待。如果太多请求被淹没(我不知道在什么时候),您将收到“连接已关闭”错误。这让我想起原始级别的垃圾收集。因此,在下面的注册表中升级(参见后面)并避免这些扼流圈,但是您仍然遇到连接设置/拆除延迟,此解决方案无法扩展。

更新:CFX_HTTP5确实支持单个ColdFusion请求中预期的保持活动和持久连接。我的ElasticSearch端点的150K查询测试先前在15分钟内完成。使用CFX_HTTP5,它在4分钟内运行。此外,我能够将注册表切换回默认端口数。下一步是弄清楚HTTPComponents是否有效。我有这个近乎工作。

更新2::使用下面建议的HTTPcomponents构建自定义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 Max Connections / Ephemeral端口 http://kb.globalscape.com/KnowledgebaseArticle10438.aspx

2 个答案:

答案 0 :(得分:2)

我99%确定CFHTTP不支持持久连接,它只是没有设置来处理它。我认为你真的需要一个不同的API来处理连接和个别请求。我没有拿到CF10,但CF9从2001年开始有一个版本的HTTPClient,所以我希望CF团队更新CF10!

我希望使用基于Java的HTTP库,例如HTTPClient。从功能列表:“连接管理支持,用于多线程应用程序。支持设置最大总连接数以及每个主机的最大连接数。检测和关闭过时连接”

答案 1 :(得分:0)

几年前我能做的就是本纳德尔的CFHTTPSession.cfc

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

我工作的项目在需求方面发生了变化,就像我发现这一点一样,所以我从未尝试过实际尝试但可能值得一看