タイムアウトミドルウェア

タイムアウト機能を提供するミドルウェアです。

使用シナリオ

Webサービスにおいて、一部のリクエストは様々な理由(データベースクエリの遅延、外部サービスの応答遅延など)により処理時間が長くなる場合があります。これらの長時間実行されるリクエストがサーバーリソースを占有し、他のリクエストの処理に影響を与えることを防ぐため、タイムアウトミドルウェアを使用してリクエストの最大処理時間制限を設定できます。この時間制限を超えると、リクエストは自動的に中断され、タイムアウトエラーが返されます。

サンプルコード

main.rs
Cargo.toml
use std::time::Duration;

use salvo::prelude::*;

#[handler]
async fn fast() -> &'static str {
    "hello"
}
#[handler]
async fn slow() -> &'static str {
    tokio::time::sleep(Duration::from_secs(6)).await;
    "hello"
}

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let acceptor = TcpListener::new("0.0.0.0:8698").bind().await;

    let router = Router::new()
        .hoop(Timeout::new(Duration::from_secs(5)))
        .push(Router::with_path("slow").get(slow))
        .push(Router::with_path("fast").get(fast));

    Server::new(acceptor).serve(router).await;
}

上記のサンプルでは、2つのハンドラー関数を作成しています:迅速に応答する fast と、6秒遅延して応答する slow です。Timeout::new(Duration::from_secs(5)) を使用して、すべてのリクエストに5秒のタイムアウト制限を設定しています。/slow パスにアクセスすると、処理時間が5秒の制限を超えるため、リクエストはタイムアウトします。一方、/fast パスにアクセスすると、リクエストは正常に処理され、結果が返されます。