WSO2 API-M:Synapse是什么?HAProxy部署下为何出现连接重置错误?
1. Synapse是什么?
Synapse是WSO2 API Manager(API-M)底层依赖的核心集成引擎,负责处理API请求的路由、消息中介、转换、安全验证等核心业务逻辑。即使你没有手动配置过Synapse相关参数,API-M默认也会启用Synapse及其Passthru Transport组件——后者是Synapse用于处理HTTP/HTTPS网络连接的模块,日志中的org.apache.synapse.transport.passthru.SourceHandler就是该组件的核心类。
2. 为何出现Connection Reset错误?
这个错误属于网络层面的连接重置异常:当Synapse的Passthru SourceHandler尝试从已建立的网络连接读取数据时,对方(这里是HAProxy)主动断开了连接,导致读取操作失败,从而抛出java.net.SocketException: Connection reset错误。
3. HAProxy导致错误的原因及解决方法
原因
HAProxy默认配置了空闲连接超时回收和健康检查机制:当API-M处于无请求的空闲状态时,HAProxy会主动断开长时间闲置的连接;但Synapse的Passthru Transport并未及时感知到连接已断开,仍尝试从该连接读取数据,最终触发错误日志。关闭HAProxy后,没有了主动断开连接的触发源,错误自然消失。
解决方法
方法一:调整HAProxy超时配置
修改HAProxy的配置文件,延长空闲连接超时时间,确保其与API-M侧的连接超时设置匹配或更长,避免HAProxy过早断开连接。示例配置:
timeout client 3600s # 客户端空闲连接超时 timeout server 3600s # 后端服务器(API-M)空闲连接超时 timeout connect 30s # 连接建立超时 timeout tunnel 3600s # 隧道模式空闲超时
方法二:同步API-M侧的连接超时设置
在WSO2 API-M的<APIM_HOME>/repository/conf/deployment.toml文件中,配置Passthru Transport的空闲超时,让API-M主动关闭过期连接,避免等待HAProxy断开:
[transport.passthru_http] idle_timeout = 300000 # 5分钟,单位毫秒,可根据HAProxy的timeout server值调整 [transport.passthru_https] idle_timeout = 300000 # HTTPS连接同样设置
方法三:优化HAProxy健康检查(可选)
如果错误是健康检查导致的,可以调整HAProxy的健康检查频率和策略,比如使用更贴合API-M的检查路径(如API-M的健康检查端点/healthcheck),避免无效检查触发连接重置:
backend apim_backend server apim_node1 192.168.1.100:8280 check inter 10s rise 2 fall 3 option httpchk GET /healthcheck HTTP/1.1\r\nHost: localhost
内容的提问来源于stack exchange,提问作者biboti6045

