環(huán)境:阿里云 alb 、2臺(tái) ecs
項(xiàng)目:web http 接口
目標(biāo):實(shí)現(xiàn)代碼發(fā)版安全重啟更替
目前想到的方案有三種:
1 alb -> nginx -> webman
設(shè)置nginx stream, 定義兩個(gè)服務(wù)端口用于更替
發(fā)版時(shí),同步最新代碼,啟動(dòng)新服務(wù),更新stream,重啟nginx, 停止舊服務(wù)
2 alb -> webman
通過(guò)調(diào)用阿里云 alb 接口,實(shí)現(xiàn)上、下服務(wù)(定義兩個(gè)服務(wù)端口用于更替),啟、停服務(wù)
3 alb -> webman
基于 reusePort + Master進(jìn)程ID,上線代碼時(shí),取得并記錄當(dāng)前進(jìn)程ID,啟動(dòng)新服務(wù),基于記錄的舊PID停止舊服務(wù)。
請(qǐng)問(wèn),上面三種是否都可行,要確保服務(wù)高可用且兼顧性能,哪種最合適。
或者,在當(dāng)前背景下,是否有更好的方案。
方案1 目前已經(jīng)實(shí)現(xiàn),壓測(cè)來(lái)看,在一定并發(fā)下發(fā)布代碼,沒(méi)有出現(xiàn)502
但考慮到 alb 本身是負(fù)載產(chǎn)品,所以想省掉nginx(nginx也會(huì)消耗一定的系統(tǒng)資源), 但后面兩種目前還沒(méi)在生產(chǎn)上實(shí)踐過(guò),不確定會(huì)不會(huì)有問(wèn)題
三種方案都可以,方案三實(shí)際上和直接執(zhí)行 php start.php reload 區(qū)別不大。
webman reload過(guò)程就是安全停止一個(gè)進(jìn)程,然后補(bǔ)充一個(gè)新的進(jìn)程,直到所有進(jìn)程更新。
有alb,nginx可以不要,所以要性能好絕對(duì)安全的話第二種方案較好。
workerman啟動(dòng)腳本里寫死的代碼不支持reload,你可以把業(yè)務(wù)分出來(lái)在onWorkerStart時(shí)加載,這樣就支持reload了
參考文檔 http://wtbis.cn/doc/workerman/faq/reload-principle.html