0

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

通常,在等待来自 ESB 的响应时,BPS 进程会暂停 3 分钟。3分钟后,一切都在继续,好像什么都没发生一样。使用 Wireshark 和一些额外的日志中介,我发现了以下内容:

  • 挂起发生在 ESB 代理中,就在输出序列之前。
  • 根据 Wireshark 的说法,当挂起发生时,ESB API 已经将其响应发送到 ESB 代理。

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

顺便说一句,仅某些特定呼叫不会发生挂起。我已经测试了好几次,每次都执行完全相同的调用,我无法预测哪个调用会挂起,或者即使任何调用都会挂起。

4

4 回答 4

1

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

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

阅读这篇文章以获取有关如何使用 FORCE_POST_PUT_NOBODY 属性的更多详细信息。

于 2017-07-11T05:12:40.893 回答
1

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

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

干杯。

于 2018-02-21T12:42:57.343 回答
1

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

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

PS:如果您也发布代理的源代码,这真的很有帮助

于 2017-07-10T22:00:22.030 回答
0

我最终得到了 WSO2 的支持。显然,我遇到了一些非常罕见的边缘案例,这对于 WSO2 工程师来说很难重现。

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

<property name="NO_KEEPALIVE" value="true" scope="axis2"/>
于 2017-09-08T10:24:24.423 回答