前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >当 HTTP 连接池遇上 KeepAlive 时

当 HTTP 连接池遇上 KeepAlive 时

作者头像
芋道源码
发布于 2018-12-29 03:43:21
发布于 2018-12-29 03:43:21
2.4K0
举报
文章被收录于专栏:芋道源码1024芋道源码1024

来源:http://t.cn/E4J2p8i

  • 1. 连接种类
  • 2 keepalive机制
  • 3. tomcat8对keepalive的实现
  • 4. 连接池对keepalive的处理
  • 5. Connection reset by peer异常

艿艿:看到 Connection reset by peer 异常,会不会头疼???


最近在使用netty作为http客户端通过pool连接tomcat的时候,出现了很多Connection reset by peer 的IOException的异常。便对问题的根源做了细致的调研。

1. 连接种类

一般连接主要分为长连接,短连接和http的keepalive连接。

1.1 长连接:建立完连接后,该连接不再进行释放。

  • 优点
    • 性能较高,不需要重复建立tcp连接或者关闭tcp连接
    • 基本上不会出现CLOSE_WAIT和TIME_WAIT的问题
  • 缺点:一般需要一个连接池来维护长连接(一般有数据库连接池,http的连接池等) 复杂度较高

1.2 短连接:每次请求均需要tcp三次握手建立连接,业务执行,tcp四次挥手关闭连接。

  • 优点:实现简单。
  • 缺点:
    • 性能较差。大部分都是tcp层面上的交互(新建和关闭tcp连接)
    • 系统会出现大量的tcp的状态是:TIME_WAIT 如果没有设置SO_RESUSEADDR ,很容易出现端口被占满的情况。(在关闭完连接时,tcp状态是TIME_WAIT,只有等2个MSL后,才会进行close掉)

1.3 http的keepalive:用于http协议。在http 1.1中,为了解决长连接提出的。

  • 优点:用于维护长连接,提升性能
  • 缺点:需要在header中进行控制,需要交互控制,相对复杂。

2 keepalive机制

提到keepalive, 容易对下面三种机制混淆:

  • keepalived
  • tcp 的 keepalive
  • http 的 keepalive

2.1 keepalived

用途:高可用,一般是和lvs一起使用。

具体可参考:http://outofmemory.cn/wiki/keepalived-configuration

2.2 tcp的keepalive

用途:socket连接的保活。在新建socket的时候,可以设置SO_KEEPALIVE 进行打开。

keepalive主要有三个参数:

  • tcp_keepalive_time: 一个连接需要TCP开始发送keepalive探测数据包之前的空闲时间。以秒为单位
  • tcp_keepalive_probes: 发送TCP keepalive探测数据包的最大数量,默认是9.如果发送9个keepalive探测包后对端仍然没有响应,便发送RST关闭掉连接。
  • tcp_keepalive_intvl: 发送两个TCP keepalive探测数据包的间隔时间,默认是75秒

2.3 http的 keepalive

用途:http的长连接,在http 1.0中使用的为短连接:每一次请求均需要新建tcp连接,http协议数据的发送接收,关闭tcp连接。 该种机制性能很 低,在http 1.1协议中引入了keepalive机制来保持tcp连接。

在http1.0中,全部是短连接,如果想建立长连接,需要在header里面加上keepalive,这样web服务器看到这个字段,不会立马关闭连接。而是将tcp连接维持一段时间。如果需要关闭,则在header中写 keepalive close,来告诉 客户端需要关闭该连接。

在http1.1中,默认会实现keepalive,如果使用的是http1.1协议,header是不需要加上keepalive的。

3. tomcat8对keepalive的实现

3.1 http 1.0实现

tomcat8中,如果发送的是http1.0的协议。 tomcat8返回的均是1.1的协议。并且不管请求的header有没有Connection:keepalive ,均会在返回的header中加上connection:close 。下面是访问tomcat8的截图:

  • GET请求是http 1.0,但是返回的是1.1的协议:

img

  • 返回的header里面有Connection:close

img

3.2 http 1.1实现

tomcat8主要有两个参数来控制keepalive的机制。keepAliveTimeout 和maxKeepAliveRequests

  • keepAliveTimeout: 默认和soTimeout 值保持一致,该值为20000ms,也就是在这么长时间内没有通信,tomcat会关闭掉该连接。设置为-1 则代表不会关闭该连接。
  • maxKeepAliveRequests :默认为100,也就是在keepAliveTimeout时间内,如果使用次数超过100,则会关闭掉该连接。设置为-1,则代表不会关闭连接。在关闭后,会在返回的header上面加上Connection:close 。

如果需要tomcat保持长连接:可配置 maxKeepAliveRequests = "-1" keepAliveTimeout=-"-1" ,则tomcat8不会关闭掉该连接。

4. 连接池对keepalive的处理

主要需要处理两个地方:

  • 1:maxKeepAliveRequests 连接达到默认的设置次数。则会在header上面加Connection:close。
    • 在接收web服务器返回的数据时,需要检查一下header里面是否有Connection:close,如果close,则需要将该连接从连接池里物理关闭掉。否则容易出现connection reset by peer的异常。
  • 2:keepAliveTimeout 超过该时间没有流量,则会关闭掉连接。
    • tomcat在连接空闲超过该时间后,会主动关闭掉连接。会向客户端发送FIN命令。

如果是IO(同步socket):则在获取连接的时候需要检查一下该socket的连接状态。 因为tcp在底层已经关闭了该连接。 如果不检查的话,则会SocketCloseException的错误。

如果是NIO(异步channel) :则在selector的时候,read数据的时候,会返回-1,然后将该连接从连接池给物理关闭掉。

5. Connection reset by peer异常

异常场景

  • 1: 当我们往一个对端已经close的通道写数据的时候,对方的tcp会收到这个报文,并且反馈一个reset报文,当收到reset报文的时候,继续做select读数据的时候就会抛出Connect reset by peer的异常。该异常为jdk抛出的异常。在native代码里面抛出。
  • 2:尝试和未开放的服务器端口建立tcp连接时,服务器tcp将会直接向客户端发送reset报文
  • 3:ack报文丢失,并且超出一定的重传次数或时间后,会主动向对端发送reset报文释放该TCP连接

连接池出现该异常分析

  • 1:由于客户端在收到Connection:close的header时候并没有物理关闭该连接,而是将该连接返回到了连接池中。
  • 2:下一个请求拿到该连接发送数据,由于tomcat的该socket通道已经关闭,tomcat接收到该连接时,便会回复一个RST。
  • 3:客户端在读取数据(RST的时候,内部会调用(JDK)SocketChannel.read的时候抛出 java.io.IOException(Connection reset by peer)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python中文分词库——jieba的用法
jieba是优秀的中文分词第三方库。由于中文文本之间每个汉字都是连续书写的,我们需要通过特定的手段来获得其中的每个单词,这种手段就叫分词。而jieba是Python计算生态中非常优秀的中文分词第三方库,需要通过安装来使用它。
Python学习者
2023/05/07
5350
jieba库的安装教程_利用jieba库进行txt分词
中文文本需要通过分词获得单个的词语; jieba是优秀的中文分词第三方库,需要额外安装; jieba库提供三种分词模式,最简单只需掌握一个函数;
全栈程序员站长
2022/11/08
1.5K0
jieba库的安装教程_利用jieba库进行txt分词
python jieba库_Python jieba库的使用说明「建议收藏」
txt= open(“D:\\三国演义.txt”, “r”, encoding=’utf-8′).read()
全栈程序员站长
2022/08/31
3.1K0
python jieba库_Python jieba库的使用说明「建议收藏」
jieba库详解「建议收藏」
点击windows+r,进入命令提示符输入cmd,进入界面后,输入pip install jieba。即可安装,示例如下:
全栈程序员站长
2022/11/08
1.1K0
jieba库详解「建议收藏」
jieba库是python内置函数库,可以直接使用_jieba库pip安装出现红字
jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点。
全栈程序员站长
2022/11/08
8940
jieba库是python内置函数库,可以直接使用_jieba库pip安装出现红字
Python中常用的第三方库_vscode如何使用第三方库
Python 第三方库依照安装方式灵活性和难易程度有 3 个方法,这 3 个方法是:pip 工具安装、自定义安装、文件安装。
全栈程序员站长
2022/11/04
1.9K0
Python系列~字段类型以及jieba库的使用
真诚是为人处世的基础。无论表达关切的一方,还是被关注的一方,只有你情我愿,才能互惠互利。
小Bob来啦
2021/01/11
9360
Python系列~字段类型以及jieba库的使用
jieba库分词代码_怎么下载jieba库
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
5820
jieba库分词代码_怎么下载jieba库
Python帮你分析孙猴子在大闹天宫时出现了几回?
由于该库是第三方库,并不是Python自带的模块,因此需要通过pip命令进行安装,pip安装命令如下:
灰小猿
2022/05/05
3550
Python帮你分析孙猴子在大闹天宫时出现了几回?
ieba库实现词性标注及小说人物角色抽取
4年人力资源从业经验,情报学硕士,主要内容涵盖python、数据分析和人力资源相关内容
冯杰宁
2019/12/11
1.4K0
python jieba分词库使用
“Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to be the best Python Chinese word segmentation module.
李小白是一只喵
2020/04/23
1.1K0
python jieba分词库使用
中文分词工具——jieba
在英语中,单词就是“词”的表达,一个句子是由空格来分隔的,而在汉语中,词以字为基本单位,但是一篇文章的表达是以词来划分的,汉语句子对词构成边界方面很难界定。例如:南京市长江大桥,可以分词为:“南京市/长江/大桥”和“南京市长/江大桥”,这个是人为判断的,机器很难界定。在此介绍中文分词工具jieba,其特点为:
伊泽瑞尔
2022/05/31
1.4K0
中文分词工具——jieba
python安装jieba库的具体步骤_无法安装lxml库
jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点。
全栈程序员站长
2022/11/08
1.5K0
python安装jieba库的具体步骤_无法安装lxml库
中文分词库 jieba
使用 python 的 jieba库可以将中文句子分割成一个一个词语, 在机器学习中,可用于生成中文的词向量。我们可以使用 pip 免费安装 jieba 库。
用户6021899
2019/08/14
1.9K0
python jieba库用法
搜索引擎模式。在精确模式的基础上,对长词再次切分,提高召回率,适用于搜索引擎分词。
红目香薰
2022/11/28
5340
jieba库的用法
“Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to be the best Python Chinese word segmentation module.
全栈程序员站长
2022/09/29
8540
Jieba分词
jieba 是一个中文分词第三方库,被称为最好的 Python 中文分词库。支持三种分词模式:精确模式、全模式和搜索引擎模式,并且支持繁体分词和自定义词典。 使用前需要额外安装(对应安装命令改为:pip install jieba)
MinChess
2022/12/26
8060
Jieba分词
学习使用Jieba1.Jieba2. 特点3.功能4.安装5.使用6.其他中文分词工具
1.Jieba 相信大多数知道NLP的人都知道什么是Jieba,但对于像我这样的新手而言,也仅限于知道而已,并没有学习过它,使用过它,打算用几天的时间来记录自己学习、使用Jieba的过程。 jieba是一款开源的中文分词工具 github ,“结巴”中文分词:做最好的 Python 中文分词组件 "Jieba" (Chinese for "to stutter") Chinese text segmentation: built to be the best Python Chinese word s
JasonhavenDai
2018/04/11
1.4K0
学习使用Jieba1.Jieba2. 特点3.功能4.安装5.使用6.其他中文分词工具
Python Jieba库
NLP(自然语言)领域现在可谓是群雄纷争,各种开源组件层出不穷,其中一支不可忽视的力量便是 jieba 分词,号称要做最好的 Python 中文分词组件。
NikoDos
2022/03/29
9450
Python Jieba库
艺术与文本的交织:基于Python的jieba和wordcloud库实现华丽词云
jieba和wordcloud是两个在自然语言处理和数据可视化领域非常常用的Python库。
Srlua
2024/05/26
4510
艺术与文本的交织:基于Python的jieba和wordcloud库实现华丽词云
推荐阅读
相关推荐
Python中文分词库——jieba的用法
更多 >
LV.1
深圳顺丰科技Java dev
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档