搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
我家小花儿
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
1月18号“纯鸿蒙”千帆启航,程序员预备!_华为鸿蒙1月18日发布会
2
gaussian_filter( )函数(高斯滤波)
3
超全RedisTemplate常用方法工具类及案例_redistemplate 工具类
4
Linux中实现dhcp功能_dhcp-4.2.5-27.el7.x86_64.rpm
5
leaflet实现点聚合_leaflet点聚合
6
Nvidia Chat With RTX安装及疑难杂症_nvidia chat with rtx启动报sentence_transformers 模块丢失
7
C++入门到精通。(十六、C++的空指针和指针的运算)_c++ 指针空 顺序
8
001 鸿蒙系统环境搭建及运行hello world_鸿蒙系统搭建
9
git安装教程
10
鸿蒙开发1、IDE安装与Hello World_鸿蒙开发idea
当前位置:
article
> 正文
线上问题分析:The target server failed to respond(目标服务器返回失败)
作者:我家小花儿 | 2024-03-20 16:57:01
赞
踩
the target server failed to respond
背景
后台服务通过REST接口调用第三方服务,调用偶尔会发生失败。查看后台日志发现,抛出The target server failed to respond。
该问题只是在特定操作下才会出现,暂时没有任何规律可言。
问题分析
1、到第三方服务器上查看后台日志,发现在相同时间点没有日志输出。查看tomcat的locahost_access访问日志,也没有发现任何日志信息。初步怀疑请求没有达到第三方服务器。
2、怀疑是gateway的问题,但是调用服务是通过ip直连的方式,没有通过gateway中转。排除此种可能。
3、为了验证http请求是否发出,以及是否到达了第三方服务器,使用tcpdump工具,对网络包进行了监控。只监控这两台服务器,脚本为:
tcpdump
host
A
and
B
-w
test
.cap
注意,此处生成的是cap文件,方便在windows上用wireshark工具进行分析。
用wireshark分析的结果如下:
从分析结果可以看出,已经与第三方服务器建立了连接,但是第三方服务器没有返回HTTP应答,只有一个TCP响应报文。由此可以排除步骤一的疑点。
但是按顺序分析这几个报文,一开始就建立一个HTTP连接,不太符合TCP连接的规范。理论上,应该是走TCP的三次握手。有一种可能是,使用了连接池的机制,重用了TCP的连接。但是为什么第三方服务器会发送一个重置的TCP报文呢?
4、在我们的服务器上查看连接情况,使用netstat -nltpa,发现有个CLOSE_WAIT状态的连接:
根据TCP的四次挥手理论,此种情况是因为第三方服务器端主动发起了关闭请求,而咱们的服务器还没有对这个请求做处理。
咱们的HTTP协议使用的是1.1版本,因此会默认为Keep-Alive,在请求头中,Connetion确实设置为了Keep-Alive。排除客户端主动关闭的可能。
查看第三方服务器的tomcat配置,发现超时时间是20s。因为在请求处理完后的20s,服务器端就会主动关闭TCP连接。
有了这个线索,我们就掌握了重现的规律:发送一个请求后20s,待客户端连接状态变为CLOSE_WAIT状态,再发送一次请求就出现错误了。
结论
1、客户端使用了HttpClient的连接池机制,因此TCP连接会被重复使用,并且由于默认使用的是HTTP 1.1协议,Keep-Alive会被置上,因此不会主动关闭连接。但是由于第三方服务器配置了20s的超时时间,TCP连接会被关闭,但是此时客户端的TCP连接会被回收到池子里,不会理睬服务器发送过来的关闭请求,因此客户端的连接状态会变成CLOSE_WAIT,而服务器经过一段时间等待后会关闭自身的TCP连接。如果客户端下一次请求正好使用了这个TCP连接,就会出现服务器返回空应答的情况,从而抛出该问题。
2、HTTP协议是基于TCP连接的,如果是重用已有的TCP连接,则TCP三次握手不会发生。抛出该问题,是HTTPClient在解析HTTP头时,发现没有数据。根本原因是因为没有返回HTTP数据包,而是返回了TCP数据包。
总结
1、可以使用HttpClient重试机制,调用第一次失败时,第二次可能就正常了。HTTP 1.1默认使用了持久连接机制,像这种情况不可避免。如果访问频繁的话,该问题不会发生,而且性能会比较高。
2、开启一个线程,定期关闭无效的TCP连接。HttpClientConnectionManager.closeExpiredConnections()、HttpClientConnectionManager.closeIdleConnections()。这个方法没试过。(此方法为官方文档的推荐方法)
3、在请求头里设置"Connection":"close"。弊端是,没有用上连接池的性能。
4、设置HttpClient的连接重用策略。目前的重用策略,对于HTTP 1.1,都是默认为可以重用。
如果服务器使用长连接配置,那不做调整应该也不会碰到该问题。
但是服务器如果设置了keep-alive时间,客户端如果也同样设置,感觉不太灵活。
有没有更好的方法,还需要去研究下HttpClient的实现。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/我家小花儿/article/detail/275172
推荐阅读
article
Caffe2
在Ubunut 16.04安装记_ubuntu16.04 安装
caffe2
makef...
A wonderful caffe 2! 尝尝鲜,
caffe2
刚开源,先给大家吃吃螃蟹吧。_ubuntu16.04 安装...
赞
踩
article
java
ftp
客户端的使用 补充
Truncated
server
reply
: ‘220 ‘问...
java
ftp
客户端的使用 补充
Truncated
server
reply
: ‘220 ‘问题。介绍了sun.n...
赞
踩
article
rk3588
编译
lunch
出错_
dumpvars
failed
with
:
exit
status ...
由于切换分支,可能有些分支存在
lunch
,在当前分支不存在,导致出错,只要将当前
lunch
指定下,即可解决。_dumpv...
赞
踩
article
ubuntu12.04LTS
系统升级
到ubuntu14.04LTS后无法正常启动问题_
mount
: ...
问题描述:ubuntu12.04LTS
系统升级
到ubuntu14.04LTS后,重启系统出现黑屏并提示如下:
mount
:...
赞
踩
article
MS
SQLServer
如何查询 空值的字段?_
sql
server
查找
空字符
的
字段名
...
select count(id) from student where ISNULL(pwd,'')=''这样 无论pw...
赞
踩
article
SQL
SERVER
数据库
储存的值里面前后
有
空格
,
有
可能是全角或者半角
空格
,
如何在
查询
中处理_sq...
例如 用户表里面的 UserCode
有
空格
,
那么如何
查询
出来对应的用户 表名 tblUser字段 UserCode表记...
赞
踩
article
SQL
Server
Len()
函数
_
sqlserver
len
...
LEN()
函数
用于输入字符串的字符数。LEN()
函数
返回输入字符串的字符数,不包括尾随空格。以下是LEN()
函数
的...
赞
踩
article
SQL
SERVER
查询
列表结果中有
空格
的解决方法_
splserver
语句
查询
有
空格
的数据
怎么办
...
1.去除
查询
字段左边的
空格
方法select ltrim(字段名) from 表名select ltrim(aaa) fr...
赞
踩
article
SQL
server
查询
所有包含
空格
的
数据...
你可以使用以下语句来
查询
所有包含
空格
的
数据:SELECT *FROM 表名WHERE 列名 LIKE '% %'替换 表...
赞
踩
article
Microsoft
SQL
Server
如何
隐藏
客户
姓名
、手机号或者
身份证号
中的部分信息_sqls...
Microsoft
SQL
Server
如何
隐藏
客户
姓名
、手机号或者
身份证号
中的部分信息_
sqlserver
查询
姓名
...
赞
踩
article
SQL
Server
条件
语句
全值匹配
空格
处理_sql
server
在匹配的时候忽略
空格
...
SQL
Server
条件
语句
全值匹配
空格
处理问题描述:请看下面两条查询
语句
:1.select * from useri...
赞
踩
article
阿里云
Windows
Server
2022 安装
Docker
_
windows
server
d...
阿里云
Windows
Server
2022 安装
Docker
_
windows
server
docker
windo...
赞
踩
article
brew
install
报错
Error
: No
developer
tools
install
ed....
brew
报错_
error
: no
developer
tools
install
ed.
install
the comm...
赞
踩
article
RocketMQ
—
Producer
(四)消息发送流程_
send
[4]
times
,
still
f...
前 言在深入讲解消息发送之前,我们可先简单概括消息的发送的主要步骤可分为:消息验证、路由查询、选择消息队列、消息组装、消...
赞
踩
article
[已解决]org.
apache
.
rocketmq
.
client
.
exception
.MQClient...
org.
apache
.
rocketmq
.
client
.
exception
.
MQClientException
: Send...
赞
踩
article
RocketMQ
发送消息报错
Send
[3]
times
, still
failed
, cost ...
就是我上面标记的broker配置留下的坑,需要进入容器修改配置文件。需要注意的是-e “MAX_POSSIBLE_HEA...
赞
踩
article
Send
[3]
times
,
still
failed
, cost [13]ms消息队列发送失败_...
2021-10-31 00:25:30.332 ERROR
org
.apache.rocketmq.spring.cor...
赞
踩
article
RocketMq源码解读(四)
消息
发送
_
send
[6]
times
, still
failed
, ...
前两章内容中,介绍了Producer的启动过程,然后是如何创建
topic
,本章内容将主要集中在如何
发送
消息
到broker...
赞
踩
article
消息队列
MQClientException
:
Send
[3]
times
,
still
fail...
原因1:未关闭防火墙防火墙未关闭,导致9876端口号未暴露出来。解决方案:systemctl stop firewall...
赞
踩
article
RocketMQ
Send [3]
times
, still
failed
,connect to 0...
记录问题 connect to 0.0.0.1:10911
failed
_org.
apache
.
rocketmq
.cli...
赞
踩
相关标签
nvidia
caffe2
ubuntu
opencv-dep
java
linux
运维
android
系统升级
sql
null
数据库
sqlserver
mysql
mms
SQL Server
条件语句
空格处理
docker
阿里云
windows
macos
分布式
架构师
中间件