Timeout-Middleware

Middleware zur Unterstützung von Timeouts.

Anwendungsfälle

In Webdiensten können bestimmte Anfragen aufgrund verschiedener Gründe (wie langsame Datenbankabfragen, verzögerte Antworten externer Dienste etc.) zu langen Verarbeitungszeiten führen. Um zu verhindern, dass diese langlaufenden Anfragen Serverressourcen blockieren und die Bearbeitung anderer Anfragen beeinträchtigen, kann die Timeout-Middleware verwendet werden, um eine maximale Bearbeitungszeit für Anfragen festzulegen. Wird dieses Zeitlimit überschritten, wird die Anfrage automatisch abgebrochen und ein Timeout-Fehler zurückgegeben.

Beispielcode

main.rs
Cargo.toml
timeout/src/main.rs
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:5800").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;
}

In dem obigen Beispiel haben wir zwei Handler-Funktionen erstellt: einen schnell antwortenden fast und einen, der erst nach 6 Sekunden antwortet (slow). Durch Timeout::new(Duration::from_secs(5)) wird für alle Anfragen ein Timeout-Limit von 5 Sekunden gesetzt. Beim Aufruf des /slow-Endpunkts wird die Anfrage aufgrund der Überschreitung der 5-Sekunden-Grenze abgebrochen, während der /fast-Endpunkt normal verarbeitet und ein Ergebnis zurückgibt.

Auf dieser Seite