Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Rust-Unterstützung für Lambda Managed Instances
Konfiguration der Parallelität
Die maximale Anzahl gleichzeitiger Anfragen, die Lambda an jede Ausführungsumgebung sendet, wird durch die PerExecutionEnvironmentMaxConcurrency Einstellung in der Funktionskonfiguration gesteuert. Dies ist eine optionale Einstellung, und der Standardwert für Rust ist 8 gleichzeitige Anfragen pro vCPU, oder Sie können Ihren eigenen Wert konfigurieren. Dieser Wert bestimmt die Anzahl der Tokio-Aufgaben, die von der Laufzeit ausgelöst werden, und ist für die gesamte Lebensdauer der Ausführungsumgebung statisch. Jeder Worker bearbeitet jeweils genau eine In-Flight-Anfrage, ohne Multiplexing pro Mitarbeiter. Lambda passt die Anzahl der gleichzeitigen Anfragen automatisch bis zum konfigurierten Maximum an, basierend auf der Kapazität jeder Ausführungsumgebung, um diese Anfragen aufzunehmen.
Erstellung von Funktionen für Mehrfachparallelität
Sie sollten bei der Verwendung von Lambda Managed Instances dieselben Thread-Sicherheitspraktiken anwenden wie in jeder anderen Multithread-Umgebung. Da das Handler-Objekt von allen Worker-Threads gemeinsam genutzt wird, muss jeder veränderbare Status Thread-sicher sein. Dazu gehören Sammlungen, Datenbankverbindungen und alle statischen Objekte, die während der Anforderungsverarbeitung geändert werden.
Um die gleichzeitige Bearbeitung von Anfragen zu aktivieren, fügen Sie Ihrer Cargo.toml Datei das concurrency-tokio Feature-Flag hinzu.
[dependencies] lambda_runtime = { version = "1", features = ["concurrency-tokio"] }
Der lambda_runtime::run_concurrent(…) Einstiegspunkt muss innerhalb einer Tokio-Laufzeit aufgerufen werden, die in der Regel durch das #[tokio::main] Attribut Ihrer Hauptfunktion bereitgestellt wird. Ihr Handler-Closure muss + implementieren CloneSend
Wenn Sie einen gemeinsamen Status für mehrere Aufrufe benötigen (einen Datenbankpool, eine Konfigurationsstruktur), binden Sie ihn ein ArcArc
Alle AWS SDKs für Rust-Clients sind konkurrenzsicher und erfordern keine besondere Behandlung.
Beispiel: SDK-Client AWS
Im folgenden Beispiel wird ein S3-Client verwendet, um bei jedem Aufruf ein Objekt hochzuladen. Der Client wird direkt in die Closure geklont, ohne: 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
Beispiel: Datenbank-Verbindungspools
Wenn Ihr Handler Zugriff auf einen gemeinsamen Status wie einen Client und eine Konfiguration benötigt, binden Sie ihn ein ArcArc in jeden Aufruf:
#[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
Gemeinsames /tmp-Verzeichnis
Das /tmp Verzeichnis wird von allen gleichzeitigen Aufrufen in derselben Ausführungsumgebung gemeinsam genutzt. Verwenden Sie eindeutige Dateinamen pro Aufruf (geben Sie z. B. die Anforderungs-ID an) oder implementieren Sie explizite Dateisperren, um Datenbeschädigungen zu vermeiden.
Protokollierung
Das Verschachteln von Protokollen (Protokolleinträge verschiedener Anfragen werden in Protokollen verschachtelt) ist in Systemen mit mehreren gleichzeitigen Vorgängen normal. Funktionen, die Lambda Managed Instances verwenden, unterstützen das strukturierte JSON-Protokollformat über die erweiterten Protokollierungssteuerungen von Lambda. Dieses Format beinhaltet dasrequestId, sodass Protokolleinträge mit einer einzigen Anfrage korreliert werden können. Weitere Informationen finden Sie unterImplementierung der erweiterten Protokollierung mit der Tracing Crate.
Kontext anfordern
Das Context Objekt wird direkt an jeden Handler-Aufruf übergeben. Wird verwendetevent.context.request_id, um auf die Anforderungs-ID für die aktuelle Anfrage zuzugreifen.
Wird verwendetevent.context.xray_trace_id, um auf die X-Ray-Trace-ID zuzugreifen. Lambda unterstützt die _X_AMZN_TRACE_ID Umgebungsvariable bei Lambda Managed Instances nicht. Die X-Ray-Trace-ID wird automatisch weitergegeben, wenn das AWS SDK für Rust verwendet wird.
Wird verwendetevent.context.deadline, um Timeouts zu erkennen — sie enthält die Frist für den Aufruf in Millisekunden.
Initialisierung und Herunterfahren
Die Funktionsinitialisierung erfolgt einmal pro Ausführungsumgebung. Objekte, die während der Initialisierung erstellt wurden, werden von allen Anfragen gemeinsam genutzt.
Bei Lambda-Funktionen mit Erweiterungen gibt die Ausführungsumgebung beim Herunterfahren ein SIGTERM-Signal aus. Dieses Signal wird von Erweiterungen verwendet, um Bereinigungsaufgaben wie das Leeren von Puffern auszulösen. lambda_runtimebietet ein Hilfsprogramm zur Vereinfachung der Konfiguration der Signalverarbeitung bei ordnungsgemäßem Herunterfahren,. spawn_graceful_shutdown_handler()
Versionen von Abhängigkeiten
Lambda Managed Instances erfordert die folgende Mindestpaketversion:
-
lambda_runtime: Version 1.1.1 oder höher, mit aktivierter Funktionconcurrency-tokio -
Die unterstützte Mindestversion von Rust (MSRV) ist 1.84.0.