Netty端口被佔用問題

問題:
 
最近發現Netty項目每次發佈的時候Netty在重啓時都會報端口被 佔用的異常, 須要過十幾秒左右手動重啓一遍, Netty才能恢復正常
目前猜想是因爲Tomcat_restart的時候Netty執行相關的銷燬操做, Channel.close().awaitUninterrupted() 以及 bossGroup和workerGroup在關閉時socket沒有徹底關閉, 也許是處於TIME-WAIT狀態, 致使Netty在重啓的時候報端口被 佔用
 
解決:
 
Netty BootStrap有一個Option SO_REUSEADDR, 做用是重用處於TIME_WAIT可是未徹底關閉的socket地址, 因爲我在本地和dev上在有大量請求的狀況下重啓也未發現有端口被 佔用的狀況, 只能在線上發佈的時候才能測試出來, 正好線上發佈的那個版本 ... 我忘記開 SO_REUSEADDR了... 因此, 只能下次再看是否有效果了
 
相關:
1) TCP四次揮手
TCP的socket鏈接在服務端單方面關閉鏈接時, 會進入以下四次揮手流程(圖片來源於網絡)

 
此時服務端socket若是處於TIME-WAIT狀態, 而又沒有開啓SO_REUSEADDR 則會出現端口被 佔用異常
 
2) SO_REUSEADDR(摘自百科)
這個 套接字 選項通知內核,若是端口忙,但TCP狀態位於 TIME_WAIT ,能夠重用端口。若是端口忙,而TCP狀態位於其餘狀態,重用端口時依舊獲得一個錯誤信息,指明"地址已經使用中"。若是你的服務程序中止後想當即重啓,而新 套接字 依舊使用同一端口,此時 SO_REUSEADDR 選項很是有用。必須意識到,此時任何非指望數據到達,均可能致使服務程序反應混亂,不過這只是一種可能,事實上很不可能
相關文章
相關標籤/搜索