问题:
最近发现QProxy每次发布的时候Netty在重启时都会报端口被占用的异常, 需要过十几秒左右手动重启一遍, Netty才能恢复正常
目前猜测是由于Tomcat_restart的时候Netty执行相关的销毁操作,
Channel.close().awaitUninterrupted() 以及 bossGroup和workerGroup在关闭时socket没有完全关闭,
也许是处于TIME-WAIT状态, 导致Netty在重启的时候报端口被占用
解决:
Netty BootStrap有一个Option SO_REUSEADDR,
作用是重用处于TIME_WAIT但是未完全关闭的socket地址, 由于我在本地和dev上在有大量请求的情况下重启QProxy也未发现有端口被占用的情况, 只能在线上发布的时候才能测试出来, 正好线上发布的那个版本 ...
我忘记开 SO_REUSEADDR了... 所以, 只能下次再看是否有效果了
相关:
1) TCP四次挥手
TCP的socket连接在服务端单方面关闭连接时, 会进入如下四次挥手流程(图片来源于网络)
此时服务端socket如果处于TIME-WAIT状态, 而又没有开启SO_REUSEADDR 则会出现端口被占用异常
2) SO_REUSEADDR(摘自百科)
这个套接字选项通知内核,如果端口忙,但TCP状态位于
TIME_WAIT
,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时 SO_REUSEADDR
选项非常有用。必须意识到,此时任何非期望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不可能 Netty端口被占用问题,古老的榕树,5-wow.com