【发布时间】:2013-07-02 19:25:45
【问题描述】:
底线:我试图了解 ColdFusion 是否能够通过 CFHTTP 标记在单个请求之外使用持久的 http 连接。这篇文章的一些内容是“我发现/尝试了什么”。
我的系统: CF10 IIS7.5 视窗 7
我目前正在通过一个 HTTP Rest 接口连接到 ElasticSearch,该接口将有大量的 cfhttp 调用。在这种情况下,ColdFusion 是客户端,而 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 在这一点上如何与操作系统交互有关。最初,我认为它会由 ColdFusion 的魔法来处理,但我开始认为它没有使用任何花哨的 Java 池魔法。
第三,我在 ColdFusion 中找不到任何关于 http 连接池的文档。它可以很好地执行 DB 连接池,但 http 池可能是一个相对较新的要求。
第四,我发现 CFX_http5 仍在使用 Tomcat 的 ColdFusion 10 中工作(机会有多大)。虽然它擅长多线程请求,但很少提及如何使用 keep-alive。如果不购买它,我无法在循环中对其进行测试。它不添加关闭标题。正如我所期望的那样,它会发送保持活动状态。
第六(自最初发布以来进行了大量编辑) 第六,Windows 有一个默认数量的临时或“临时”端口,它可以利用这些端口来生成新的出站 TCP 连接。默认情况下,一旦打开连接,Windows 将保持其活动状态两分钟(尽管此时它只是被放弃并占用空间)。这是一个 TCP 配置,所以 http 标头在这里并不直接起作用。默认可用端口数是 5,000 减去 1024 = 3076 个端口。这意味着一个盒子上的所有 ColdFusion 实例可以在任何给定的两分钟窗口内发出多达 3076 个 http 请求,而不会因等待可用的连接端口而阻塞。如果过多的请求被淹没(我不知道在什么时候),您将收到“连接关闭”错误。这让我想起了原始级别的垃圾收集。因此,在下面的注册表(见帖子)中升级,您可以避免这些阻塞,但您仍然会遇到连接设置/断开延迟,并且此解决方案将无法扩展。
更新:在单个 ColdFusion 请求中,CFX_HTTP5 确实支持保持连接和持久连接。我对 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
【问题讨论】:
-
虽然我意识到这是几年后的事了,但感谢您所做的一切,JT。为了那些感兴趣的人,我会补充一下,你可以在这里找到更多关于 httpcomponent 的信息:hc.apache.org,尤其是hc.apache.org/httpcomponents-client-ga/tutorial/pdf/…。
标签: http coldfusion