首先我们至少得知道什么连接吧?
网络通信的七层协议自不必说,是我们入门互联网一开始就要学习的,HTTP协议是应用层协议,传输层和网络层分别为TCP,IP协议!
也就是说我们建立连接起码需要TCP协议的三次握手,认证通过之后client和server之间才能保证数据传输,才算是连接上了,而断开连接的时候需要四次挥手,是一个连接断连(close)的过程!
短连接:经过client发起连接,开始认证(三次握手),数据传输,连接关闭(close)!
长连接:经过client发起连接,开始认证,数据传输,探测连接,数据传输。。。。连接关闭!
短连接追求的是每次通信之后,就断开连接,能避免长时间连接对server性能的开销,而长连接是在建立之后,只有客户端发起关闭请求,或者服务端探测不到客户端的响应以后才进行连接的关闭,这样长连接就不需要多次的创建和销毁连接,节省创建开销!
再看看多线程,JAVA的多线程模型如果对于每一次的连接都需要创建一个线程来维护连接,如果为长连接的时候,线程不能释放,按照每个线程1M的内存消耗,8G的服务器顶多也只能支撑几千个连接,更多的连接请求将把服务器撑爆!
而如果处理短链接,最好使用线程池,避免关闭连接的时候线程释放不及时,造成内存泄露,使用线程池可以保证线程复用,在一定量的连接里,性能更好!
单就连接来看,因为IP协议的限制,最大的连接数为2的48次方,但是假设单单的连接使用内存来看,假设只使用了10k内存,那么一台8g内存的机器也只能支持百万连接,再加上程序保持连接的线程,线程中的对象消耗等,高并发状况下的可处理连接就少的可怜了,所以多线程处理短连接更有优势一些!
当然现在的web服务器处理长连接的方法多如牛毛,避免大量线程创建的方法避不开reactor模型,比如netty框架!
区别于多线程的处理方式,reactor模型使用一个线程(当然现在也会加上监控线程啥的),不断的轮询连接,有数据传输的情况下才进行处理,性能极好!
这种多路复用的模型很是复杂,不在这个回答的范围内,改天分享!更多的技术分享,敬请关注。。。
联系客服