底线:我试图了解ColdFusion是否能够通过CFHTTP标记利用单个请求之外的持久http连接。这篇文章中有一些是“我发现了什么/尝试过什么”。
我的系统: CF10 IIS7.5Windows 7
我目前正在通过HTTP接口连接到ElasticSearch,该接口将具有大量的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请求,而无需等待可用的连接端口。如果太多的请求被淹没(我不知道在哪一点),您将收到一个“连接关闭”错误。这让我想起了一个原始级别的垃圾收集。因此,提高注册表的级别(请参阅下面的post),您可以避免这些瓶颈,但是您仍然会遇到连接设置/删除延迟,并且这个解决方案不会扩展。
Update:CFX_HTTP5确实支持在单个ColdFusion请求中保持活动和持久连接。我对我的ElasticSearch端点的150 K查询测试在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有此功能,这表明它是可行的,但是谁知道是如何实现的呢?
CFX_http5自定义标记使用C++作为自定义http连接,因此它有可能理解连接池。http://www.cftagstore.com/tags/cfxhttp5.cfm
一个相关问题:在ColdFusion中维护出站TCP连接池
关于Windows连接/临时端口http://kb.globalscape.com/KnowledgebaseArticle10438.aspx
发布于 2013-07-03 08:53:30
我99%确信CFHTTP不支持持久连接,它只是没有设置来处理它。我认为您确实需要一个不同的API来处理连接和单独的请求。我手头上还没有CF10,但是CF9有一个2001年的HTTPClient版本,所以我希望CF团队能用CF10更新!
我希望使用一个基于Java的HTTP库,比如HTTPClient。在功能列表中:“用于多线程应用程序的连接管理支持。支持设置最大总连接以及每个主机的最大连接。检测并关闭陈旧连接。”
发布于 2013-07-21 06:25:19
几年前我能看到的是本·纳德尔的CFHTTPSession.cfc
http://www.bennadel.com/projects/cfhttp-session.htm
我所从事的项目在需求方面发生了变化,就像我发现这一点一样,所以我从来没有真正尝试过它,但可能值得一看。
https://stackoverflow.com/questions/17434138
复制相似问题