玩rpc、Netty、连接池的童鞋一定知道长连接,TCP 本身并没有长短连接的区别,长短与否完全取决于我们怎么用它。通常要求高性能需要完成端到端频繁通信以及连接个数受限的系统交互一般都采用长连接。另外长连接还常常被用来做数据的推送,可以很方便的实现 push 模型。
短连接
每次通信时,创建 Socket,完成三次握手,一次通信结束,调用socket.close()关闭。这就是一般意义上的短连接,短连接的好处是管理起来比较简单,不需要额外的控制手段。
长连接
每次通信完毕后,不会关闭连接,这样可以做到连接的复用,长连接的好处是省去了创建连接(三次握手)的耗时。
在分布式的中,网络的不可用随时发生,使用长连接需要考虑很多问题:
- 连接的管理维护,比较好理解就是可以获取、新增、释放连接,一般情况下Server/Client端需要(Map<Host, Channel> channels; //Host=ip:port)容器管理连接
- 连接的保活,之前讲过
比如拿我们熟悉的Dubbo(20880)来理解 TCP
可以使用一个 client 负责循环发送请求,shell中通过命令:lsof -i:20880 查看端口相关使用情况(参数FD 代表了文件句柄,每一条连接都会占用新的文件句柄,如果你在使用 TCP 通信的过程中出现了
open too many files
的异常,那就应该检查一下,你是不是创建了太多连接,而没有关闭,最多也就7w多个)
短连接没有太多东西可以讲,长连接的管理在高并发中确实不易,比如druid的连接池中就用到了生产者-消费者模型,内部实现也相对的复杂。