Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Supporto Rust per istanze gestite Lambda
Configurazione della concorrenza
Il numero massimo di richieste simultanee che Lambda invia a ciascun ambiente di esecuzione è controllato dall'impostazione nella configurazione PerExecutionEnvironmentMaxConcurrency della funzione. Questa è un'impostazione opzionale e il valore predefinito per Rust è 8 richieste simultanee per vCPU, oppure puoi configurare il tuo valore. Questo valore determina il numero di attività Tokio generate dal runtime ed è statico per tutta la durata dell'ambiente di esecuzione. Ogni lavoratore gestisce esattamente una richiesta in corso alla volta, senza multiplazione per lavoratore. Lambda regola automaticamente il numero di richieste simultanee fino al massimo configurato in base alla capacità di ciascun ambiente di esecuzione di assorbire tali richieste.
Creazione di funzioni per la multiconcorrenza
È necessario applicare le stesse pratiche di sicurezza dei thread quando si utilizzano le istanze gestite Lambda come si farebbe in qualsiasi altro ambiente multithread. Poiché l'oggetto handler è condiviso tra tutti i thread di lavoro, qualsiasi stato mutabile deve essere thread-safe. Ciò include raccolte, connessioni al database e qualsiasi oggetto statico modificato durante l'elaborazione della richiesta.
Per abilitare la gestione simultanea delle richieste, aggiungi il flag di concurrency-tokio funzionalità al tuo Cargo.toml file.
[dependencies] lambda_runtime = { version = "1", features = ["concurrency-tokio"] }
Il punto di lambda_runtime::run_concurrent(…) ingresso deve essere chiamato dall'interno di un runtime Tokio, in genere fornito dall'#[tokio::main]attributo sulla funzione principale. La chiusura del gestore deve implementare CloneSend
Quando hai bisogno di uno stato condiviso tra le chiamate (un pool di database, una struttura di configurazione), inseriscilo ArcArc
Tutti i client AWS SDK for Rust sono sicuri per la concorrenza e non richiedono una gestione speciale.
AWS Esempio: client SDK
L'esempio seguente utilizza un client S3 per caricare un oggetto a ogni chiamata. Il client viene clonato direttamente nella chiusura senza: Arc
let config = aws_config::load_defaults(BehaviorVersion::latest()).await; let s3_client = aws_sdk_s3::Client::new(&config); run_concurrent(service_fn(move |event: LambdaEvent<Request>| { let s3_client = s3_client.clone(); // cheap clone, no Arc needed async move { s3_client.put_object() .bucket(&event.payload.bucket) .key(&event.payload.key) .body(event.payload.body.into_bytes().into()) .send() .await?; Ok(Response { message: "uploaded".into() }) } })) .await
Esempio: pool di connessioni al database
Quando il gestore ha bisogno di accedere a uno stato condiviso, ad esempio un client e una configurazione, inseriscilo ArcArc in ogni chiamata:
#[derive(Debug)] struct AppState { dynamodb_client: DynamoDbClient, table_name: String, cache_ttl: Duration, } let config = aws_config::load_defaults(BehaviorVersion::latest()).await; let state = Arc::new(AppState { dynamodb_client: DynamoDbClient::new(&config), table_name: std::env::var("TABLE_NAME").expect("TABLE_NAME must be set"), cache_ttl: Duration::from_secs(300), }); run_concurrent(service_fn(move |event: LambdaEvent<Request>| { let state = state.clone(); async move { handle(event, state).await } })) .await
Directory /tmp condivisa
La /tmp directory è condivisa tra tutte le chiamate simultanee nello stesso ambiente di esecuzione. Utilizza nomi di file univoci per ogni chiamata (ad esempio includi l'ID della richiesta) o implementa il blocco esplicito dei file per evitare il danneggiamento dei dati.
Registrazione dei log
L'interlacciamento dei log (le voci di registro di diverse richieste vengono interlacciate nei log) è normale nei sistemi multi-concorrenti. Le funzioni che utilizzano Lambda Managed Instances supportano il formato di log JSON strutturato tramite i controlli di registrazione avanzati di Lambda. Questo formato includerequestId, che consente di correlare le voci di registro a una singola richiesta. Per ulteriori informazioni, vedereRegistrazione avanzata con la cassa Tracing.
Contesto della richiesta
L'Contextoggetto viene passato direttamente a ogni chiamata del gestore. Utilizzare event.context.request_id per accedere all'ID della richiesta corrente.
Utilizzare event.context.xray_trace_id per accedere all'ID di traccia X-Ray. Lambda non supporta la variabile di _X_AMZN_TRACE_ID ambiente con Lambda Managed Instances. L'ID di traccia X-Ray viene propagato automaticamente quando si utilizza l' AWS SDK per Rust.
Viene utilizzato event.context.deadline per rilevare i timeout: contiene la scadenza della chiamata in millisecondi.
Inizializzazione e spegnimento
L'inizializzazione della funzione avviene una volta per ambiente di esecuzione. Gli oggetti creati durante l'inizializzazione vengono condivisi tra le richieste.
Per le funzioni Lambda con estensioni, l'ambiente di esecuzione emette un segnale SIGTERM durante lo spegnimento. Questo segnale viene utilizzato dalle estensioni per attivare attività di pulizia, come lo svuotamento dei buffer. lambda_runtimeoffre un aiuto per semplificare la configurazione di una corretta gestione del segnale di spegnimento,. spawn_graceful_shutdown_handler()
Versioni di dipendenza
Lambda Managed Instances richiede la seguente versione minima del pacchetto:
-
lambda_runtime: versione 1.1.1 o successiva, con la funzionalità abilitataconcurrency-tokio -
La versione minima di Rust (MSRV) supportata è 1.84.0.