為什么這個(gè)就可以實(shí)現(xiàn)平滑重啟。 沒有看懂。 怎么保證。我在重啟的時(shí)候 之前沒有完成的請求可以繼續(xù)完成。新的請求不過來
得分開理解,就拿 restart 和 reload 舉例來說吧
那再來說說 -g 參數(shù)
上面的描述針對的都是指令本身,也就是裸參行為,但是一旦帶了-g參數(shù),那么上述指令的行為就會發(fā)生微妙的變化,體現(xiàn)在: 當(dāng)子進(jìn)程發(fā)現(xiàn)依然有活動的TCP連接時(shí),子進(jìn)程是不會退出的,換句話就是它就會等待你把事情干完,所以我想在必要的時(shí)候(比如業(yè)務(wù)干完了)是需要關(guān)閉下TCP連接的。
如此看來,應(yīng)該使用: restart -g 或 reload -g
再補(bǔ)充下,其實(shí)對于短連接這個(gè)是沒有問題,長連接我認(rèn)為還要做些額外工作: 比如在收到reload -g 指令后【業(yè)務(wù)層可以在onWorkerReload回調(diào)里干】還是應(yīng)該有個(gè)timeout機(jī)制的,可以先判斷下是否有?;顢?shù)據(jù)包或者通過一個(gè)標(biāo)記位判斷有沒有業(yè)務(wù)正在處理,沒有就直接干掉TCP連接,否則限定在timeout內(nèi)干完然后再干掉TCP連接.
當(dāng)子進(jìn)程發(fā)現(xiàn)依然有活動的TCP連接時(shí),子進(jìn)程是不會退出 。 子進(jìn)程 怎么發(fā)現(xiàn) 有沒有活動的進(jìn)程的
如何平滑重啟,你得看看worker啟動之后,進(jìn)入事件循環(huán)的代碼看select的容易理解點(diǎn),結(jié)合你現(xiàn)在看到的信號代碼;select事件循環(huán)的首先就是觸發(fā)信號處理函數(shù),后面才是處理讀寫time等事件,就是調(diào)用綁定的事件回調(diào)函數(shù);所以當(dāng)worker進(jìn)程執(zhí)行到pcntl_signal_dispatch后面的代碼,即使有信號事件來也不會觸發(fā),當(dāng)然這里說的除了SIGKILL信號,這就達(dá)到了worker還在處理業(yè)務(wù)的時(shí)候是不會退出的,但是如果不加-g參數(shù)父進(jìn)程給worker發(fā)送的是SIGKILL信號,這個(gè)信號會立刻讓進(jìn)程退出,SIGKILL信號是不會暴露給用戶的,就是這個(gè)信號不能綁定用戶的回到函數(shù)