为什么我的 WSO2 EI (ESB) 代理服务挂起 3 分钟?

Why does my WSO2 EI (ESB) proxy service hang for 3 minutes?

我有一个 BPS 进程可以快速执行对 ESB 代理的大量调用。 ESB代理调用了一个ESBAPI,它调用了我们自己产品的API

通常,BPS 进程在等待来自 ESB 的响应时恰好暂停 3 分钟。 3分钟后,一切继续,若无其事。使用 Wireshark 和一些额外的日志中介,我发现了以下内容:

这次上吊刚好用了 3 分钟这一事实应该是一个提示。我在配置文件中搜索了任何指定 180 秒的内容,但唯一的是 http 套接字超时和 http transportReceiver 的 threadKeepAliveTime。如果我减少这些,BPS 会抛出一个 p2p 通信错误而不是继续。对我来说,这表明后台某处的某些东西仍然导致某些呼叫延迟 3 分钟。

顺便说一下,只有某些特定的调用才会挂起。我已经测试了好几次,每次都执行完全相同的调用,但我无法预测哪个调用会挂起,甚至无法预测是否有任何调用会挂起。

我建议您在 faultSequence 中至少添加一个 <send /> 调解器。 也许还可以添加一个简单的 makefault 中介(不要让它太复杂 - 只需一个静态错误响应即可 - 在这个阶段你不希望故障源自 faultSequence)

我怀疑后端服务或输出序列中存在某些错误,甚至可能未处理 faultSequence - 这意味着代理不会将响应发送回调用者,而是挂起直到超时

PS: 如果你 post 你的代理的源代码也很有帮助

我以前有时也有过同样的经历,当时我试图在没有请求主体的情况下调用 PUT 或 POST 方法。但是,默认情况下,当 http 方法为 POST 或 PUT 时,WSO2 ESB 期望消息体将请求发送到后端服务器。

我必须发送带有请求正文的请求(至少是一个空的 JSON: {})或在您的 API 中使用 属性 FORCE_POST_PUT_NOBODY。

阅读此 post 了解有关如何使用 FORCE_POST_PUT_NOBODY 属性 的更多详细信息。

我最终得到了 WSO2 的支持。显然,我遇到了一些非常罕见的边缘情况,WSO2 工程师很难重现。

最终,修复结果是在代理服务的发送中介之前添加以下内容属性:

<property name="NO_KEEPALIVE" value="true" scope="axis2"/>

如果您在 WSO2 中启用线路日志,您将意识到 NGIX 在请求中使用 HTTP 1.0 客户端。

为了解决这个问题,将您的 NGINX 映射更改为使用 "proxy_http_version 1.1;",问题将得到解决。

干杯。