0

目前,我使用 Camel 作为编排引擎(一个 HTTP 请求进来,我的 Camel 应用程序将发送某些 HTTP 消息并根据回复做出决定)。Camel 应用程序运行在 Apache 的 TomCat 之上。

作为测试的一部分,我开始向我的 Camel 应用程序发送越来越多的并发请求。精简后的场景如下:

 HTTP POST --> Camel --> HTTP GET to server Z
                     <-- 200 ok (this could take up to 5 sec)
           <-- 200 ok

问题:同时发送 20 个请求时,一切正常(所有请求都由 Camel 应用程序处理)。

但是,当发送 21 个请求时,我看到以下行为:正在处理前 20 个请求,并且只有当第一个请求收到最终回复(= 200 ok)时,第 21 个 HTTP GET 请求才会发送到服务器 Z ??

这意味着对于 20 个请求,所有请求都在大约 5 秒内得到处理。但是当发送 21 个请求时,大约需要 10 秒(最后一个请求只能在 5 秒后由服务器 Z 处理)!

现在,我在 Camel 代码中添加了一些日志记录(向服务器 Z 发送 HTTP GET 消息之前和之后的时间戳),这让我很困惑:根据日志信息,Camel 确实立即发送了第 21 个请求!(它不等待第一条消息的 200 ok 最终回复?!)

所以,我想知道......这个第 21 个请求(到服务器 Z 的 HTTP GET)在哪里卡住了 5 秒?为什么?这真是让我脑洞大开……

所以,总结一下第 21 个请求:

在骆驼日志中:

  time x           = POST comes in
  time x+some msec = Camel sends HTTP GET to server Z
  time x+10        = Camel receives 200 ok on HTTP GET

在wireshark中:

  time x           = POST comes in
  time x+5         = Camel sends HTTP GET to server Z
  time x+10        = Camel receives 200 ok on HTTP GET  

注意:我在我的骆驼代码中打印时间戳如下:

    .log("${date:now:yyyyMMdd-HH-mm-ss-SSS} **** Sending HTTP GET message... ****")
    .to("{{serverZ.endpoint}}")
4

1 回答 1

2

经过进一步调查,我发现了限制因素。Apache 的 HTTP 公共客户端有一个名为“MAX TOTAL CONNECTIONS”的参数,其默认值为 ... 20 !

增加这个参数后,我不再遇到这个问题。

注意:我使用的是 Spring 框架 (STS) 和 Eclipse IDE。对于我的 Camel 应用程序,我修改了 applicationContext.xml 文件,如下所示:

<bean id="http" class="org.apache.camel.component.http.HttpComponent">
    <property name="camelContext" ref="camel"/>
    <property name="httpConnectionManager" ref="myHttpConnectionManager"/>
</bean>

<bean id="myHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
    <property name="params" ref="myHttpConnectionManagerParams"/>
</bean>

<bean id="myHttpConnectionManagerParams" class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
    <property name="defaultMaxConnectionsPerHost" value="1000"/>
    <property name="maxTotalConnections" value="1000"/>    
</bean>
于 2012-05-15T09:57:51.503 回答