優雅地停機
優雅停機指的是在伺服器關閉時,並非立即終止所有連線,而是先停止接收新的請求,同時讓已接受的請求有足夠時間完成處理後再關閉服務。這種方式可以避免請求被突然中斷,提升使用者體驗與系統可靠性。
Salvo 提供了優雅停機的支援,透過 Server
的 handle
方法取得伺服器控制代碼,然後呼叫 stop_graceful
方法來實現。在呼叫該方法後,伺服器會:
- 停止接受新的連線請求
- 等待現有請求處理完成
- 在指定的逾時時間後(如有提供),強制關閉剩餘連線
以下是一個簡單範例:
use salvo_core::prelude::*;
#[tokio::main]
async fn main() {
let acceptor = TcpListener::new("127.0.0.1:5800").bind().await;
let server = Server::new(acceptor);
let handle = server.handle();
// 優雅地關閉伺服器
tokio::spawn(async move {
tokio::time::sleep(std::time::Duration::from_secs(60)).await;
handle.stop_graceful(None);
});
server.serve(Router::new()).await;
}
在上面的範例中:
server.handle()
取得伺服器的控制代碼,可用於控制伺服器的生命週期
handle.stop_graceful(None)
開始優雅停機程序,None
表示不設定逾時時間,會一直等待所有請求處理完畢
- 如需設定逾時時間,可以傳入
Some(Duration)
,逾時後會強制關閉剩餘連線
這種方式特別適用於需要在容器環境或雲端平台上部署的應用,以及需要進行熱更新時確保請求不會被意外中斷的情況。