優雅地停機

優雅停機指的是在伺服器關閉時,並非立即終止所有連線,而是先停止接收新的請求,同時讓已接受的請求有足夠時間完成處理後再關閉服務。這種方式可以避免請求被突然中斷,提升使用者體驗與系統可靠性。

Salvo 提供了優雅停機的支援,透過 Serverhandle 方法取得伺服器控制代碼,然後呼叫 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),逾時後會強制關閉剩餘連線

這種方式特別適用於需要在容器環境或雲端平台上部署的應用,以及需要進行熱更新時確保請求不會被意外中斷的情況。