TCP长连接的连接池、容量控制与心跳保活

news2024/9/22 1:36:43

一、长连接与短连接

TCP 本身并没有长短连接的区别,长短与否,完全取决于我们怎么用它。

  • 短连接:每次通信时,创建 Socket;一次通信结束,调用 socket.close()。这就是一般意义上的短连接,短连接的好处是管理起来比较简单,存在的连接都是可用的连接,不需要额外的控制手段。
  • 长连接:每次通信完毕后,不会关闭连接,这样就可以做到连接的复用。长连接的好处便是省去了创建连接的耗时。

想要简单,不追求高性能,使用短连接合适,这样我们就不需要操心连接状态的管理;想要追求性能,使用长连接,我们就需要担心各种问题:比如端对端连接的维护,连接的保活。

长连接还常常被用来做数据的推送,我们大多数时候对通信的认知还是 request/response 模型,但 TCP 双工通信的性质决定了它还可以被用来做双向通信,在长连接之下,可以很方便的实现 push 模型。

1、系统瓶颈

(1) 长连接服务主要功能是收发数据,保持在线,使用的系统资源主要包括:CPU,内存,网卡;

(2) 当连接活跃时,大量数据接收与发送,会用到更多的CPU和网卡,大量用户在线的时候,需要维持这些连接,保持会话,需要用到大量内存;

2、设计难点

(1) 设计单台物理连接数100W的处理能力;

(2) CPU资源充分利用,线程的分配;

(3) 内存合理分配,数据结构选择;

(4) 异步化,剥离业务逻辑和网络IO之间的相互依赖

三、重点解决

1、连接池

长连接意味着连接是复用的,每次请求完连接不关闭,下次请求继续使用该连接。

如果请求是串行的,那完全没有问题。但在并发场景下,所有请求都需要使用该连接,为了保证连接的状态正确,加锁不可避免,如果连接只有一个,就意味着所有请求都需要排队等待。

因此长连接通常意味着连接池的存在:连接池中将保留一定数量的连接不关闭,有请求时从池中取出可用的连接,请求结束将连接返回池中。

连接池经常遇到的一个问题就是池大小的控制:

  • 过大的连接池会带来资源的浪费,同时对服务端也会带来连接压力;
  • 过小的连接池在高并发场景下会限制并发性能。

通常的解决办法是延迟创建和设置空闲时间,延迟创建是指连接只在请求到来时才创建,空闲时间是指连接在一定时间内未被使用则将被主动关闭。

这样日常情况下连接池控制在较小的尺度,当并发请求量较大时会为新的请求创建新的连接,这些连接在请求完毕后返还连接池,其中的大部分会在闲置一定时间后被主动关闭,这样就做到了并发性能和IO资源之间较好的平衡。

1、线程管理

为了充分利用CPU,需要合理的进行线程规划。整个长连接服务使用事件驱动,包括:定时器事件和IO事件(listen fd,socket fd, pipe fd), 所以线程规划就是合理给这些事件分配线程。

(1) 大量连接socket需要平均分配到各个线程;

(2) 新的连接请求量比较大,listen线程压力大,需要考虑多线程处理;

 

主要涉及到3种fd的线程分配:

(1) 监听fd,包括监听逻辑层的连接请求和监听客户端的连接请求,并且支持启动多个监听端口,每个端口多个线程同时工作,整体会按顺序分配到线程;

(2) 连接fd,包括逻辑层的连接和客户端的连接,采用fd取余线程数,保证平均分配到所有线程;

(3) pipe fd,负责本线程管道中数据的读取,每个线程一个;

这个样是的每个线程的CPU使用率相当。

2、长连接保活

长连接的第二个问题就是连接保活的问题。虽然TCP协议并没有限制一个连接可以保持多久,理论上只要不关闭连接,连接就一直存在。

但事实上由于NAT等网络设备的存在,一个连接即使没有主动关闭,它也不会一直存活。

长连接保活由于TCP自身的断开确认机制,如果一条TCP连接中间网络断开,此时客户端和服务端物理网络断开导致客户端和服务端都没有办法通知对方连接断开,这样服务端和客户端就会存在死连接,造成假在线,占用的资源得不到有效的回收,长连接保活主要有下面两种方式:

(1) TCP keepalive,通过设置Keepalive参数,TCP协议栈会在超过一定时间没有数据交互的时候,发送Keepalive探测包,如果连接几次都没有收到回包,则断开连接,优点是TCP协议栈提供的功能,稳定占用带宽较少;

(2) 采用应用层心跳包的方式,客户端定时向服务端发送心跳包,服务端收到心跳包后立即进行回包,客户端如果没有检测到回包,则断开连接;服务端检测超时还没有收到心跳包,则断开连接,优点主要是应用层有感知,可控并且可以带些业务数据,比如时间戳;

3、容量控制

在TCP连接建立到通信的流程中,为了防止一些恶意连接与攻击,长连接服务做了容量控制,体现在下面几个方面:

(1) 客户端建立TCP连接到TLS握手,再到发出登录请求返回登录结果,整个过程是连贯的,如果客户端停在中间的某一步骤而不往下进行,就会一直占用服务端资源,针对这种情况,服务端增加了定时控制,在TCP 连接之后30s,如果没有收到登录请求,服务端会主动断开连接;

(2) 服务统计了正在进行TLS握手,正在进行登录校验的连接数量,分别设置上限,防止同时出现大量请求的时候,对后端服务的冲击;

(3) 增加了会话通信过程中Buffer内存使用量的上限,防止对端不接收数据,导致服务端数据积压;

(4) 增加了IP统计服务,建立连接后,会将新连接的IP等信息发送到IP统计服务,对整个服务的客户端IP 情况作统计监控,增加IP黑名单功能;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FastReport .NET 2023.2.7 FastReport Crack

快速报告 .NET 适用于 .NET 7 的报告和文档创建库 v. 2023.2.7 适用于 .NET 7、.NET Core、Blazor、ASP.NET、MVC 和 Windows Forms 的全功能报告库。它可以在微软视觉工作室 2022 和 JetBrains Rider 中使用。 利用 .NET 7、.NET Core、Blazor、ASP.NET、MVC 和 Windows For…

yara规则--编写

编写 YARA 规则 — yara 4.2.0 文档 YARA规则易于编写和理解,并且它们的语法是 类似于 C 语言。这是您可以编写的最简单的规则 YARA,它什么都不做: rule dummy {condition:false } 一、规则标识符 每个规则都以关键字“ rule”开头&#xff0…

成功案例丨Fortinet为跨国汽配制造企业打造典型安全SD-WAN网络

某国际化汽车配件制造企业(以下简称某企业)为解决跨国数据传输难、单一网络费用贵等痛点,决定采用SD-WAN这一新的组网形式。Fortinet携手中企通信为其打造组网高效、云网一体化、集中管理和编排的安全SD-WAN网络,通过精准流量和应…

数据库实验 | 第5关:使用游标的存储过程

任务描述 本关任务: jdxx数据表有四个字段,分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。 例如,查询天心区(qxmc)的所有字段的值结果如图所示 任务要求 建立存储过程 tjdq(in sf varchar(10)) 输入省份的名称,将该省份…

创建web项目-----idea

创建项目 file—new—projiect java enterprise—next next 修改项目名字,finish 在此窗口打开新建的项目,选择this Window 新建好项目后是这样子的 配置项目的tomcat环境 file—project structure project 配置jdk和编译输入目录 libraries配…

【数据结构与算法】图像——四叉树自适应模糊(ppm图像为例)

源于大作业~~ 目录 前言 一、实现算法 二、结果展示 三、算法框架 (1) QuadTreeNode.h (2) 结点扩展、细化模糊层次 (3) 模糊化图像四叉树转为图像 (4) 主函数代码 四、说明 五、结语 前言 一张图片常常会存在空间冗余,即一大部分区域的色彩值相同&am…

Node.js二:fs模块

一.fs模块概述 2.fs异步写入 /*** 新建一个文件夹,座右铭.txt,写入内容三人行必有我师焉*///1.导入fs模块 const fs require(fs);//2.写入文件 fs.writeFile(./座右铭.txt,三人行必有我师焉,err >{//err写入失败:错误对象,写…

搭建CDH错误记录(踩坑无数)

搭建CDH流程记录 如何搭建本地yum源 1.配置yum源这里使用 阿里源 http://mirrors.aliyun.com/repo/Centos-7.repo wget http://mirrors.aliyun.com/repo/Centos-7.repo2.安装http软件 yum install httpd -y3.配置httpd.conf vi /etc/httpd/conf/httpd.conf在 AddType appli…

【社区图书馆】vue的生命周期

目录 vue的生命周期 生命周期流程 Init Events & Lifecycle beforeCreate Init injections & reactivity created beforeMount Create vm $el and replace ‘el’ with it mounted beforeUpdate Virtual Dom re-render and patch updated beforeDestroy vm…

python+vue 大学生社团管理系统

本系统分为学生,管理员,社团负责人三个角色,学生可以注册登陆系统,查看社团,申请入团,查看参加社团活动,查看社团新闻,社团负责人对社团信息,入团审核,社团新…

Opencv+Python笔记(五)图像阈值化处理

图像阈值化可以理解为一个简单的图像分割操作,阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的像素点使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。 阈值处理有2种方式,一种是固…

ijkplayer解码流程源码解读

ijkplayer是一款基于ffmpeg的在移动端比较流行的开源播放器。FFmpeg是一款用于多媒体处理、音视频编解码的自由软件工程,采用LGPL或GPL许可证。 要想理解ijkplayer源码,首先得知道视频播放器的基本原理。 视频播放器播放一个互联网上的视频文件&#xf…

win10怎么录屏幕视频带声音?有哪些需要注意的地方?

随着科技的不断发展,屏幕录制已成为常见的工具之一。在Win10系统中,录制屏幕视频带声音也变得越来越简单。本文将指导您如何在Win10上实现录制屏幕视频带声音,并介绍一些需要注意的地方。 需要用到的工具和步骤 在Win10系统中,自…

【u盘提示:驱动器未格式化】如何解决?

u盘虽然使用很方便,可随时拷贝资料到任何有电脑的地方,但它的问题也是比较多的,其中u盘提示驱动器未格式化故障最让人心虚,因为已经无法打开u盘了,里面的资料怎么办,很重要的怎么办,所以今天就教…

OAuth2.0 实战总结

title: OAuth2.0 实战总结 date: 2023-01-30 11:23:12 tags: OAuth2.0 categories:开发技术及框架 cover: https://cover.png feature: false 1. 引言 1.1 OAuth 2.0 是什么? 用一句话总结来说,OAuth 2.0 就是一种授权协议。那如何理解这里的“授权”…

前端调试技巧

前端工作中,不仅编码很重要,重现bug,解决bug的能力同样重要。而这些都离不开代码调试。本文就一些调试技巧做出总结,不足之处,欢迎大家多多补充。 PC调试 console.log() 在你觉得有问题的代码处,加上一句 …

基于HFSS软件24GHz雷达天线设计

前言:近年来,我国的汽车保有量不断增加,汽车交通事故引发的财产损失和人 员伤亡也在不断增加。为了有效减少交通事故发生,车载雷达得到了各大汽车厂商和各个研究机构的普遍重视。现在国际上主要国家都把 24GHz 和 77GHz 两个频段分…

解决谷歌翻译不能使用的问题

今天登录国外网站,发现谷歌翻译已无法正常使用,网上最多的方法就是更改host文件,在host内增加ip地址,但是经常失效,经常手动更改增加ip着实烦恼,还有可能有别的错误。 最终解决方式是:登录GitH…

新版本ProPhet时间序列预测1:模型解释和安装和初步使用

ProPhet时间序列预测1安装和初步使用 安装pip安装conda安装 Prophet模型使用读取数据将数据处理为ds和y两列看下数据的分布模型训练预测可视化预测结果可视化趋势、假期、每周、季节性、年度季节性的回归图1.0之前模型保存 安装 安装1.0版本之后: 区别: 1.0版本叫prophet <…

设计模式-行为型模式之策略模式

5. 策略模式 5.1. 模式动机 完成一项任务&#xff0c;往往可以有多种不同的方式&#xff0c;每一种方式称为一个策略&#xff0c;我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。 在软件开发中也常常遇到类似的情况&#xff0c;实现某一个功能有多个途径&#x…