Middleware di Timeout

Fornisce supporto middleware per la gestione dei timeout.

Casi d'Uso

Nei servizi web, alcune richieste potrebbero richiedere troppo tempo per essere elaborate a causa di vari motivi (come query di database lente, risposte ritardate da servizi esterni, ecc.). Per evitare che queste richieste a lunga esecuzione consumino risorse del server e influenzino l'elaborazione di altre richieste, è possibile utilizzare un middleware di timeout per impostare un limite massimo di tempo di elaborazione per le richieste. Se questo limite temporale viene superato, la richiesta verrà automaticamente interrotta e verrà restituito un errore di timeout.

Codice di Esempio

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;
}

Nell'esempio sopra, abbiamo creato due funzioni di gestione: una fast a risposta rapida e una slow che ritarda di 6 secondi prima di rispondere. È stato impostato un limite di timeout di 5 secondi per tutte le richieste utilizzando Timeout::new(Duration::from_secs(5)). Quando si accede al percorso /slow, la richiesta scadrà perché il tempo di elaborazione supera il limite di 5 secondi. Al contrario, quando si accede al percorso /fast, la richiesta verrà elaborata normalmente e restituirà un risultato.