1.背景
最近一个项目中,出现了java.net.ConnectException:Cannotassignrequestedaddress的异常。通过查找资料、分析后,认为是由于程序对外建立新连接,结果本地端口已经用完导致的异常。
2.问题原因
为什么会出现这种情况呢?就要从linux的TCP/IP协议栈说起了。 先看一下TCP/IP的状态图:
主动关闭连接的一方,连接会处在TIME-WAIT的状态下,需要等2MSL时间后,系统才会回收这条连接,端口才可以继续被使用。
我们的项目场景是需要发送大量的短连接。这样在高并发的场景下,就会出现端口不足,从而抛出java.net.ConnectException:Cannotassignrequestedaddress的异常。
3.解决方案
3.1 横向扩展
简单就是加机器,减少单台服务器的TCP创建次数。
不过这样需要注意几个地方:
第一,项目是否可以支持横向扩展,我们的项目是基于kafka的consumer,很难简单通过加机器做到横向扩展。
第二,需要明确单台服务器的处理瓶颈,如果随着业务量的不断增加,还是会出现这