跟我学代码架构设计模式之--对连接(Connection)和服务能力的探讨

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w1857518575/article/details/85274274

问题的引入:

很多服务的访问都是需要客户端带有连接池来访问的,比如jdbc连接数据库、MQ客户端连接队列服务器、甚至浏览器访问web服务器。很多人只是知道使用连接池保持多个连接能够提高吞吐量,但是没有一个更详细的概念,这里我来分析下这个问题。

Connection是什么?

其实连接就是一个双向联通的管道,在管道至上可以横切放置很多的协议编解码器,也就是我们所说的协议栈。

我们可以把连接比做成一个双向单道的高速公路。然后把物理的网线比做成双向多通道的高速公路,为什么网线是多通道的高速公路?因为在操作系统层面的N多个连接最终是复用到了一根网线上,也就是一个网线逻辑上承载了N多个Connection!那么实际能承载多少连接呢?下面继续分析

网线的限制:

其实就是网络带宽的限制,因为一根物理网线的带宽是一定的,比如1M 100M 1000M,固定的带宽导致其上承载的连接不是越多越好的,连接在操作系统中体现为socket,socket作为一种数据结构本身也是要占用内存空间,所以在操作系统层面上对能建立多少连接也是有限制的,其实就是操作系统的最大连接数这个参数,这样能防止资源的浪费。

服务层面上分析连接数:

这里的服务指的是接收连接的后台服务器程序,在服务器角度上,连接只是和客户端进行消息交互的通道,只是服务器通常会服务多个客户端。

# 由于要服务多个客户端,服务器应该对每个客户端能建立的连接数有个限制,防止一个客户端建立太多的连接占满了连接数资源,导致其他客户端不能继续建立连接访问服务器。

# 对于绝大多数的服务器,一般都会有状态标识来识别客户端的身份,绝大多数服务器通常的做法都是用session或者token等东西来识别客户端,session或者token数据信息都是在应用层发送的消息里面体现的,很少会与connection绑定身份状态数据,原因很简单:因为连接受网络影响很容易断掉,如果我们把身份信息绑定在连接上,就会导致:

1 客户认证信息的生命周期严格和连接绑定,不能灵活控制来满足业务需求

2 对于同一个客户端向服务器建立多个连接的情况,只有所有连接都断了,才能认定客户端下线!

基于上面的分析,连接就只会单纯的作为客户端和服务端消息传输的通道来用,身份和状态数据由上层应用协议业务逻辑层来处理,达到了业务和传输分离的设计思想。

传输和业务分离对我们分析连接数有什么关系呢?

答案是:只要考虑一点,只要连接数设置的在小于物理线路带宽的前提下,即能满足客户端的并发要求,又不会给服务端多客户服务带来压力即可!  即在前提要求下,我们的客户端业务线程并发越高,我们的连接数也应该设置的多一些!

如果设置少了,就会导致客户端业务线程排队,不能充分利用线程资源和带宽资源!

如果设置多了,会给服务端带来压力的同时,被客户端的物理带宽卡了脖子,一样会导致业务线程耗时过长,达不到高并发的效果 !

(完)

猜你喜欢

转载自blog.csdn.net/w1857518575/article/details/85274274
今日推荐