目前,我使用 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}}")