在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  PHP  C  C++  GO/ golang http server重啟過程中如何繼續(xù)提供服務(wù)(優(yōu)雅重啟)

golang http server重啟過程中如何繼續(xù)提供服務(wù)(優(yōu)雅重啟)

架構(gòu)是這樣的:
nginx做反向代理,將http請求proxy pass到后端的golang http server

 nginx==>httpserver

可否這樣實現(xiàn)優(yōu)雅重啟
1.啟動一個新的golang http server監(jiān)聽其他端口
2.修改nginx配置文件,將之前的代理端口改為新啟動的server監(jiān)聽的端口
3.reload nginx
4.并行一段時間老的http server沒有請求處理,則kill掉

整體實現(xiàn)優(yōu)雅重啟?這個是否可行,還有什么更好的方案?

回答
編輯回答
荒城

想到兩個方法:

方法一:
如果是比較新的內(nèi)核版本3.9以上,支持SO_REUSEPORT,那么你可以:

  1. 啟動一個新的進(jìn)程,也監(jiān)聽相同的端口。
  2. 新的進(jìn)程啟動后給老的進(jìn)程發(fā)個信號。
  3. 老的進(jìn)程收到后停止接收新的連接請求(停止Accept,關(guān)閉Listen Socket),
    等所有已經(jīng)存在的連接處理完自動退出。

如果不支持SO_REUSEPORT,不同進(jìn)程無法同時監(jiān)聽同一個端口,則需要在老的進(jìn)程內(nèi)fork一個子進(jìn)程,并且把負(fù)責(zé)監(jiān)聽的文件描述符傳給新進(jìn)程。
這個方法可以實現(xiàn)你的需求,但需要比較多的修改Golang封裝的net/http等系統(tǒng)庫,技術(shù)復(fù)雜度比較高。
好處是不需要nginx參與,對它透明。

方法二:
可以同時運(yùn)行兩個或更多個http server,同時提供服務(wù),讓nginx做負(fù)載均衡,其中有一個需要升級重啟時,就發(fā)個信號,收到信號后停止接收新請求,已有請求處理完畢正常退出就可以了。這個過程不需要修改nginx配置,也不需要reload nginx。
這個方法也需要改Golang封裝的net/http,但修改量相比方法一會小很多。

2017年2月20日 04:19