【问题标题】:Understanding Persistent HTTP Connections in ColdFusion了解 ColdFusion 中的持久 HTTP 连接
【发布时间】: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 有这个可用,这表明它在可能的范围内,但是谁知道 Adob​​e 是如何实现 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

【问题讨论】:

标签: http coldfusion


【解决方案1】:

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

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

【讨论】:

  • 关于 HTTPClient 的好主意。我还将购买 CFX_http5 并试一试。虽然它已经有几年历史并且被废弃了,但它仍然比多年来对内置标签和引擎的一些支持(查询查询、正则表达式、cfhttp、cfpop 等)要好。但是,我们确实得到了 CFPOD 和CFTWITTER!
  • 如果您确实发现 HTTPClient 或其他解决方案有效,您可以在这里发布吗?我相信很多人会对允许通过 CF(或通过 CF 的 Java)进行持久 HTTP 连接的解决方案非常感兴趣。谢谢!
  • Brian,我更新了,一旦我确定我已经解决了任何挥之不去的内存问题,我就会发布代码。 HTTPComponents 绝对是我们要走的路,但我似乎只是为了简单而使用 CFX_HTTP5。
【解决方案2】:

几年前我能看到的是 Ben Nadel 的 CFHTTPSession.cfc

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

当我发现这一点时,我从事的项目的需求发生了变化,所以我从来没有真正尝试过,但可能值得一看

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2017-05-28
    • 2011-04-27
    相关资源
    最近更新 更多