了解ColdFusion中的持久HTTP连接

了解ColdFusion中的持久HTTP连接,http,coldfusion,Http,Coldfusion,一句话:我试图了解ColdFusion是否能够通过CFHTTP标记在单个请求之外使用持久http连接。这篇文章的一部分是“我发现了什么/尝试了什么” 我的系统: CF10 IIS7.5 视窗7 我目前正在通过HTTP Rest接口连接ElasticSearch,该接口将有大量的cfhttp调用。在本例中,ColdFusion是客户端,ElasticSearch是服务器。按照建议,我将keep alive标头与cfhttp请求一起传递,但发现cfhttp似乎总是在它之后添加一个close,从而生成

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

我的系统: CF10 IIS7.5 视窗7

我目前正在通过HTTP Rest接口连接ElasticSearch,该接口将有大量的cfhttp调用。在本例中,ColdFusion是客户端,ElasticSearch是服务器。按照建议,我将keep alive标头与cfhttp请求一起传递,但发现cfhttp似乎总是在它之后添加一个close,从而生成此标头:

<!--- 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连接池的文档。它可以很好地实现数据库连接池,但http池可能是一个相对较新的需求

第四,我发现CFX_http5仍在与Tomcat一起在ColdFusion 10中工作(机会有多大)。虽然它擅长处理多线程请求,但很少提到如何使用keep-alive。如果不购买它,我就无法在循环中测试它。它不添加关闭标题。正如我所预料的那样,它让我保持活力

第六(自最初发布以来大量编辑) 第六,Windows具有默认数量的临时或“临时”端口,可用于生成新的出站TCP连接。默认情况下,一旦连接打开,Windows将使其保持活动状态两分钟(尽管此时它只是被放弃并占用空间)。这是一个TCP配置,因此http头在这里不直接起作用。默认可用端口数为5000减去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
HTTPComponents连接池:
单个请求,对同一连接的无限制CFHTTP=单个打开的TCP连接

N-requests=我99%确定CFHTTP不支持持久连接,只是没有设置来处理它。我认为您确实需要一个不同的API来处理连接和单个请求。我手头没有CF10,但是CF9有一个2001年的HTTPClient版本,所以我希望CF团队用CF10更新


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

几年前,我可以看到Ben Nadel的CFHTTPSession.cfc


就在我发现这一点的时候,我所从事的项目的需求发生了变化,因此我从未真正尝试过,但可能值得一看

关于HTTPClient的好主意。我还打算购买CFX_http5并试一试。虽然它已经有几年的历史了,并且已经被废弃了,但这仍然比多年来对内置标签和引擎(查询、regex、cfhttp、cfpop等)的一些支持要好。然而,我们确实得到了CFPOD和CFTWITTER!如果您发现HTTPClient或其他解决方案有效,可以在此处发布吗?我相信很多人都会对一种允许通过CF(或通过CF的Java)进行持久HTTP连接的解决方案非常感兴趣。谢谢布赖恩,我更新了,一旦我确定我有任何挥之不去的记忆问题得到解决,我就会发布代码。HTTPComponents无疑是我们的发展方向,但由于它的简单性,我可能会觉得有些人只是在使用CFX_HTTP5。尽管我意识到这是几年后的事了,感谢所有这些,JT。为了这些利益,我将加上