應用程式優雅的退出和熱公升級

2022-08-03 23:27:24 字數 1854 閱讀 7479

應用程式部署上線正式執行後,都會遇到程式公升級維護的問題,一般情況下都直接kill掉執行中的應用程式,然後更新程式,啟動程式。這樣進行操作會遇到乙個問題就是,在kill掉程式的時候,不能保證當前程式是沒有進行業務處理的,如果存在請求,當前的業務會失敗,如果是獲取資料,不會產生太大的問題,如果是其它情況,有可能會產生錯誤資料或髒資料,如何優雅的解決程式公升級但是又不影響正在執行的業務的執行(如何進行熱公升級)?

進行程式的熱公升級的必要條件:

應用程式的更新

正在執行的程式停止資料的接入(停止埠監聽),處理完接入的請求後自動退出

啟動更新後的應用程式,並進行資料接入。

程式的啟動和退出,作業系統都會發出相對應的訊號,程式可以監聽對應的訊號來進行處理。golang中,可以通過signal包中的notify進行訊號的監聽。

package main

import (

"fmt"

"os"

"os/signal"

"syscall"

)func main()

}

需要注意的是,不同的作業系統對訊號的處理方式是不一樣的。golang的訊號主要是對類unix的作業系統。對於window系統,control+c會觸發os.interrupt,對於訊號的支援可以參考godoc。

golang中的http server中有乙個connstate的函式變數,可以用於監聽請求的鏈結狀態變化。

}可以在connstate中通過監聽state的變化來計數接入數判斷當前正在處理中的業務數。需要注意的是,http的復用,有可能多次請求,只有乙個new的state

接收作業系統傳送的sigint訊號,阻塞退出

監聽請求鏈結數變化,鏈結數為0且收到sigint訊號出發真正的退出訊號

exit := make(chan int, 1) //用於mark是否真的退出

iscalllexit := false //用於mark是否接收到exit signal

count := 0 //用於mark 正在處理請求數

}使用os.startprocess啟動新的應用程式(由於原來的應用程式的埠已經釋放,新的程式可以重新進行監聽)

針對熱更新,facebook有完整的實現。優雅的處理完後退出)

優雅的程式公升級)

優雅的Android應用程式完全退出方案

網上有關應用程式完全退出有一堆的解決方案,大致歸類如下 1.任務管理器方法 activitymanager 2.android.os.process.killprocess。3.單例模式建立乙個activity管理物件,該物件中有乙個activity容器,每次新開啟一activity就加入到容器中,...

應用程式動態全屏和退出全屏

讓程式全屏的方法,大家都知道,那是靜態的,程式執行之初就申明了。但是如果有這樣的需求 要在程式執行的過程中,執行了某個操作而使之全屏,然後還需要退出全屏,怎麼做?如下 windowmanager.layoutparams attrs getwindow getattributes attrs.fla...

應用程式動態全屏和退出全屏

讓程式全屏的方法,大家都知道,那是靜態的,程式執行之初就申明了。但是如果有這樣的需求 要在程式執行的過程中,執行了某個操作而使之全屏,然後還需要退出全屏,怎麼做?如下 windowmanager.layoutparams attrs getwindow getattributes attrs.fla...