Timeouts konfigurieren in AWS SDK for Java 2.x - AWS SDK for Java 2.x

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.

Timeouts konfigurieren in AWS SDK for Java 2.x

Das AWS SDK for Java 2.x bietet mehrere Ebenen der Timeout-Konfiguration, um Sie bei der Erstellung robuster Anwendungen zu unterstützen. Das SDK bietet verschiedene Arten von Timeouts, die zusammenarbeiten, um die Leistung und Zuverlässigkeit Ihrer Anwendung zu optimieren.

Es gibt zwei Hauptkategorien von Timeouts im SDK:

  • Service Client Timeouts — Timeouts auf hoher Ebene, die API-Operationen steuern

  • HTTP-Client-Timeouts — Niedrige Timeouts, die die Netzwerkkommunikation steuern

Timeouts für Service-Clients

Timeouts für Serviceclients funktionieren auf API-Ebene und steuern das Gesamtverhalten von Dienstvorgängen, einschließlich Wiederholungsversuchen und Mehrfachversuchen.

Timeout bei API-Aufrufen

Das Timeout für API-Aufrufe legt die maximale Zeitdauer für einen gesamten API-Vorgang fest, einschließlich aller Wiederholungsversuche. Dieses Timeout gibt eine feste Grenze dafür, wie lange Ihre Anwendung auf den Abschluss eines vollständigen Vorgangs wartet.

S3Client s3Client = S3Client.builder() .overrideConfiguration(ClientOverrideConfiguration.builder() .apiCallTimeout(Duration.ofMinutes(2)) // Total time for entire operation, such as when you call the getObject method. .build()) .build();

Wichtigste Merkmale:

  • Beinhaltet alle Wiederholungsversuche.

  • Beinhaltet die Wartezeit zwischen Wiederholungsversuchen.

  • Bietet die absolute maximale Wartezeit.

  • Verhindert, dass Operationen auf unbestimmte Zeit ausgeführt werden.

Timeout für API-Aufrufversuche

Das Timeout für API-Aufrufversuche legt die maximale Zeit für einen einzelnen Versuch einer API-Operation fest. Wenn dieses Timeout überschritten wird, versucht das SDK den Vorgang erneut (sofern Wiederholungen konfiguriert sind), anstatt den gesamten Aufruf fehlschlagen zu lassen.

S3Client s3Client = S3Client.builder() .overrideConfiguration(ClientOverrideConfiguration.builder() .apiCallAttemptTimeout(Duration.ofSeconds(30)) // Time for single attempt. .build()) .build();

Wichtigste Merkmale:

  • Gilt nur für einzelne Versuche.

  • Ermöglicht schnelle Fehler und Wiederholungen bei langsamen Anfragen.

  • Muss kürzer als das Timeout für API-Aufrufe sein.

  • Hilft bei der Identifizierung vorübergehender Probleme und bei deren Behebung.

Konfigurieren Sie Timeouts für den Service-Client

Sie können Service-Client-Timeouts global für alle Operationen oder pro Anfrage konfigurieren:

Globale Konfiguration:

S3Client s3Client = S3Client.builder() .overrideConfiguration(b -> b .apiCallTimeout(Duration.ofSeconds(105L)) .apiCallAttemptTimeout(Duration.ofSeconds(25L))) .build(); // When you use the s3Client for an API operation, the SDK uses the configured timeout values.

Konfiguration pro Anfrage:

S3Client basicS3Client = S3Client.create(); // The following configuration uses the same settings as shown before, but these settings // apply to only the `putObject` call. When you use `basicS3Client` in another API call without // supplying the override configuration, there are no API timeout limits. No timeout limits is the default for the SDK. AwsRequestOverrideConfiguration overrideConfiguration = AwsRequestOverrideConfiguration.builder() .apiCallTimeout(Duration.ofSeconds(105L)) .apiCallAttemptTimeout(Duration.ofSeconds(25L)) .build(); basicS3Client.putObject(b -> b .bucket("amzn-s3-demo-bucket") .key("example-key") .overrideConfiguration(overrideConfiguration), RequestBody.fromString("test"));

Bewährte Methoden für API-Timeouts

Das SDK for Java 2.x legt standardmäßig keine Timeouts für API-Aufrufe oder einzelne API-Aufrufversuche fest. Legen Sie Timeouts sowohl für einzelne Versuche als auch für die gesamte Anfrage fest. Auf diese Weise schlägt Ihre Anwendung schnell fehl, wenn vorübergehende Probleme dazu führen, dass Anforderungsversuche länger dauern, oder wenn schwerwiegende Netzwerkprobleme auftreten.

Zeitüberschreitungen beim HTTP-Client

HTTP-Client-Timeouts wirken auf Netzwerkebene und steuern verschiedene Aspekte der HTTP-Kommunikation. Diese Timeouts variieren je nachdem, welche HTTP-Client-Implementierung Sie verwenden.

Verbindungstimeout

Das Verbindungs-Timeout steuert, wie lange gewartet werden muss, wenn eine neue Verbindung zum Endpunkt hergestellt wird AWS-Service .

// Available with all HTTP clients. ApacheHttpClient.builder() .connectionTimeout(Duration.ofSeconds(5L)) .build();

Zweck:

  • Beugt Problemen mit der Netzwerkverbindung vor.

  • Schlägt schnell fehl, wenn Dienste nicht erreichbar sind.

  • Unverzichtbar für Anwendungen, die eine reaktionsschnelle Fehlerbehandlung benötigen.

Socket-Timeout (Apache und URLConnection Clients)

Das Socket-Timeout steuert, wie lange bei einer bestehenden Verbindung auf Daten gewartet werden soll.

ApacheHttpClient.builder() .socketTimeout(Duration.ofSeconds(30L)) // Time to wait for response data. .build();

Timeouts für Lese- und Schreibvorgänge (Netty-Client)

Der Netty-Client bietet separate Timeouts für Lese- und Schreibvorgänge:

NettyNioAsyncHttpClient.builder() .readTimeout(Duration.ofSeconds(30L)) // Reading response data. .writeTimeout(Duration.ofSeconds(30L)) // Writing request data. .build();

Timeout für TLS-Verhandlungen (Netty-Client)

Steuert die für TLS/SSL den Handshake zulässige Zeit:

NettyNioAsyncHttpClient.builder() .tlsNegotiationTimeout(Duration.ofSeconds(3L)) .build();

Timeouts für den Verbindungspool

Einige HTTP-Clients bieten Timeouts für Verbindungspool-Operationen:

ApacheHttpClient.builder() .connectionAcquisitionTimeout(Duration.ofSeconds(10L)) // Wait for pool connection. .connectionTimeToLive(Duration.ofMinutes(5L)) // Maximum connection age. .connectionMaxIdleTime(Duration.ofSeconds(60L)) // Maximum idle time. .build()

Das Konfigurieren Sie HTTP-Clients enthält weitere Informationen zu HTTP-Clients im AWS SDK for Java 2.x

Timeout-Interaktionen und Hierarchie

Für eine korrekte Konfiguration ist es entscheidend zu verstehen, wie verschiedene Timeouts interagieren:

Timeout-Hierarchie

API Call Timeout (2 minutes) ├── Retry Attempt 1 │ ├── API Call Attempt Timeout (45 seconds) │ └── HTTP Client Timeouts │ ├── Connection Timeout (5 seconds) │ ├── TLS Negotiation Timeout (3 seconds) │ └── Read/Write Timeout (30 seconds) ├── Retry Attempt 2 │ └── [Same structure as Attempt 1] └── Retry Attempt 3 └── [Same structure as Attempt 1]

Regeln für die Konfiguration

Timeout bei API-Aufrufen ≥ Timeout bei API-Aufrufversuchen
// Correct configuration. .apiCallTimeout(Duration.ofMinutes(2)) // 120 seconds. .apiCallAttemptTimeout(Duration.ofSeconds(30)) // 30 seconds.
Zeitlimit für API-Aufrufversuche ≥ Zeitüberschreitungen für HTTP-Clients
// HTTP client timeouts must be less than attempt timeout. .apiCallAttemptTimeout(Duration.ofSeconds(30L)) // 30 seconds. // HTTP client configuration. .connectionTimeout(Duration.ofSeconds(5L)) // 5 seconds. .readTimeout(Duration.ofSeconds(25L)) // 25 seconds (< 30).
Konto für mehrere Versuche
// If you have 3 retry attempts, each taking up to 30 seconds // API call timeout must be at least 90 seconds plus overhead. .apiCallTimeout(Duration.ofMinutes(2L)) // 120 seconds. .apiCallAttemptTimeout(Duration.ofSeconds(30)) // 30 seconds per attempt.

Verwenden Sie die Standardeinstellungen für intelligente Konfigurationen

Das SDK bietet intelligente Standardeinstellungen, die automatisch die entsprechenden Timeout-Werte konfigurieren:

// Enable smart defaults. S3Client client = S3Client.builder() .defaultsMode(DefaultsMode.AUTO) // Automatically choose appropriate defaults. .build(); // Available modes: // - STANDARD: Balanced defaults // - IN_REGION: Optimized for same-region calls // - CROSS_REGION: Optimized for cross-region calls // - MOBILE: Optimized for mobile applications // - AUTO: Automatically detect and choose appropriate mode // - LEGACY: Provides settings that were used before smart defaults existed.

Intelligente Standardeinstellungen konfigurieren automatisch:

  • Werte für das Verbindungs-Timeout.

  • Timeout-Werte für TLS-Verhandlungen.

  • Andere Client-Einstellungen.

Übersicht

Eine effektive Timeout-Konfiguration AWS SDK for Java 2.x erfordert ein Verständnis der Wechselwirkung zwischen Service-Client-Timeouts und HTTP-Client-Timeouts:

  1. Timeouts für Service-Clients steuern das API-Verhalten auf hoher Ebene.

  2. HTTP-Client-Timeouts steuern das Netzwerkverhalten auf niedriger Ebene.

  3. Die richtige Hierarchie stellt sicher, dass Timeouts effektiv zusammenarbeiten.

  4. Intelligente Standardeinstellungen bieten gute Ausgangspunkte für die meisten Anwendungen.

Konfigurieren Sie Timeouts entsprechend Ihrem Anwendungsfall, um Anwendungen zu erstellen, die sowohl gegen Netzwerkprobleme resistent sind als auch auf Benutzer reagieren.