# 接口重发失败或重发无记录问题
# 1、接口重发报错:“没找到主机路由”,导致重发失败
# 问题现象
在IPAAS 910版本集成平台中,出现以下异常现象:
- 接口调用偶发超时:某个业务接口在正常运行时能够调通,但偶尔出现超时、或者业务异常导致失败的情况;
- 失败记录进入“失败重发”列表:超时的接口调用记录被系统记录到失败重发列表;
- 重发时路由错误:在进行失败重发操作时,portal组件报错“没找到主机路由”,导致重发失败。
# 问题分析
# 根本原因
问题的根源在于重发时使用的URL与原始请求URL不一致:
原始请求路径:业务系统在调用接口时,使用的是完整的服务地址,包含端口信息(如
http://example.com:9091/api/service)Nginx转发处理:请求经过Nginx代理转发时,Nginx在记录请求信息时,
$tip_real_url变量中没有携带端口信息(变为http://example.com/api/service)重发机制:
- 失败重发机制是基于
$tip_real_url变量记录的地址进行重发 - 由于$tip_real_url给到ipaas时丢失了端口信息(9091),重发时使用没有端口的URL
- portal根据不完整的URL找不到到对应的接口,因此报错“没找到主机路由”
- 失败重发机制是基于
# 配置问题
# Nginx配置问题点
# 原配置中$tip_real_url变量没有包含端口信息
location /api/ {
proxy_pass http://backend_service;
# 缺失端口信息的配置
proxy_set_header Host $host;
}
# 解决方案
# 修复方法
在Nginx配置中,修改$host的配置,确保端口信息被正确传递:
# 修改前
proxy_set_header Host $host;
# 修改后 - 添加端口信息
proxy_set_header Host $host:9091;
# 或者动态获取端口
proxy_set_header Host $host:$server_port;
# 验证配置文件语法
nginx -t
# 平滑重启Nginx
nginx -s reload
# 验证方法
测试接口调用:确认业务接口仍能正常调用
模拟超时场景:触发失败重发机制,验证重发时URL是否包含端口
检查日志:查看portal日志,确认不再出现“没找到主机路由”错误
# 2、接口失败重发成功,但是没有日志记录
# 问题现象
失败重发机制出现以下异常:
- 重发功能正常:失败交易能够触发重发机制,接口调用成功
- 记录缺失:重发后无法查看重发记录和重发次数信息
- 配置已开启:已开启记录报文体和监控调用链功能,但重发信息仍未记录
# 问题分析
# 根本原因
问题的根源在于重发请求的标识参数被Nginx过滤:
重发标识机制:失败重发时,系统会在请求头中自动增加一个特殊参数
esb_fail_cid,用于标记该请求是失败交易重发Nginx过滤处理:Nginx默认配置可能会过滤掉非标准的请求头参数,导致
esb_fail_cid参数在请求传递过程中丢失记录机制失效:
- 重发记录和次数统计依赖于
esb_fail_cid参数进行识别和关联 - 由于该参数被Nginx过滤,后端系统无法识别该请求是重发请求
- 因此无法生成重发记录和统计重发次数
- 重发记录和次数统计依赖于
# 关键代码/配置问题
# Nginx配置问题点
# 默认配置可能过滤了非标准请求头
location /api/ {
proxy_pass http://backend_service;
# 缺少对esb_fail_cid等自定义请求头的放行配置
}
# 解决方案
# 修复方法
在Nginx配置中,显式配置允许传递自定义请求头参数,确保esb_fail_cid不被过滤:
# 修改前 - 可能过滤自定义头
proxy_pass http://backend_service;
# 修改后 - 显式允许传递自定义头
http {
# 在http块中配置允许下划线请求头
underscores_in_headers on;
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://backend_service;
# 无需显式设置,所有请求头都会被传递
proxy_pass_request_headers on;
}
}
}
# 验证配置并重启Nginx
# 验证配置文件语法
nginx -t
# 平滑重启Nginx
nginx -s reload
# 验证方法
触发重发场景:模拟失败交易,触发重发机制
检查请求头:使用抓包工具或日志查看重发请求是否携带esb_fail_cid参数
查看调用日志:检查重发记录和重发次数是否正确生成