Mule 4中HTTP POST请求出现"Remotely closed"错误求助
问题分析与解决方案
针对CloudHub中通过DLB调用系统API时出现的"Remotely closed"错误,核心原因是多层超时配置不匹配、空闲连接被DLB提前回收,结合你的环境参数和配置,给出以下针对性调整方案:
1. 对齐全链路空闲超时配置
当前DLB超时7分钟(420000ms),系统API监听器连接空闲超时仅6分钟(360000ms),流程API的connectionIdleTimeout未明确值,三者超时不一致会导致DLB或系统API提前断开空闲连接。
调整建议:
- 流程API请求连接:将
${awsSysApi.idletTimeout}设置为400000ms(略小于DLB超时),避免被DLB优先回收 - 系统API监听器:修改
connectionIdleTimeout为420000ms(与DLB超时一致),同时调大readTimeout至400000ms(覆盖大Payload的处理时间)
修改后的系统API监听器配置:
<http:listener-connection host="${http.host}" port="${http.private.port}" readTimeout="400000" connectionIdleTimeout="420000"> <reconnection> <reconnect frequency="30000" count="2" /> </reconnection> </http:listener-connection>
2. 禁用连接复用,避免回收连接被重复使用
DLB会自动回收空闲连接,若流程API复用已被回收的连接,会触发"Remotely closed"。强制每次请求新建连接可解决此问题:
在流程API的HTTP请求配置中添加连接池配置,设置maxIdle为0:
<http:request-config name="Aws_Sys_API_HTTP_Request_configuration" doc:name="HTTP Request configuration" doc:id="5a7eb30f-9850-4de5-8cca-a7d77b0c10d4" basePath="${awsSysApi.basepath}"> <http:request-connection host="${awsSysApi.host}" port="${awsSysApi.port}" protocol="HTTPS" connectionIdleTimeout="${awsSysApi.idletTimeout}"> <reconnection> <reconnect frequency="${retry.millisecondsBetweenRetries}" count="${retry.maxRetries}" /> </reconnection> <http:connection-pool maxIdle="0" /> <!-- 禁用空闲连接复用 --> <tls:context> <tls:trust-store insecure="true" /> <tls:key-store type="jks" path="${tls.keyStore.path}" keyPassword="${secure::tls.keyStore.keyPassword}" password="${secure::tls.keyStore.password}" /> </tls:context> </http:request-connection> </http:request-config>
3. 调整请求响应超时,匹配DLB限制
当前流程API请求的responseTimeout为10分钟(600000ms),远大于DLB的7分钟超时,会导致DLB断开连接后请求仍在等待响应,触发错误。
将流程API请求的responseTimeout修改为400000ms:
<http:request method="POST" doc:name="POST GZIP / aws system api" doc:id="0b490747-5069-4546-9446-8b77130ae848" config-ref="Aws_Sys_API_HTTP_Request_configuration" path="${awsSysApi.databricksPath}" responseTimeout="400000"> <!-- 其余配置保持不变 --> </http:request>
4. 优化大Payload传输
30MB的GZIP Payload可能导致传输过程中连接长时间无数据交互,触发空闲超时。添加分块传输头,避免一次性发送完整Payload:
在流程API的请求头中添加Transfer-Encoding: chunked:
<http:headers><![CDATA[#[output application/java --- { "client_secret" : p('secure::awsSysApi.client_secret'), "Content-Type" : "application/gzip", "client_id" : p('secure::awsSysApi.client_id'), "Transfer-Encoding" : "chunked" }]]]></http:headers>
5. 验证DLB的TCP层超时
部分负载均衡除了应用层超时,还存在TCP层面的空闲超时(如部分LB的TCP超时默认350秒),需确认DLB的TCP超时设置,确保与应用层超时对齐。若TCP超时小于DLB的7分钟,需联系MuleSoft支持调整。
内容的提问来源于stack exchange,提问作者joono
相关产品推荐
相关产品推荐

