As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Configurar tempos limite em AWS SDK for Java 2.x
O AWS SDK for Java 2.x fornece várias camadas de configuração de tempo limite para ajudá-lo a criar aplicativos resilientes. O SDK oferece diferentes tipos de tempos limite que funcionam juntos para otimizar o desempenho e a confiabilidade do seu aplicativo.
Há duas categorias principais de tempos limite no SDK:
-
Tempos limite do cliente de serviço - tempos limite de alto nível que controlam as operações da API
-
Tempos limite do cliente HTTP - tempos limite de baixo nível que controlam a comunicação de rede
Tempos limite do cliente de serviço
Os tempos limite do cliente de serviço operam no nível da API e controlam o comportamento geral das operações de serviço, incluindo novas tentativas e várias tentativas.
Tempo limite de chamada da API
O tempo limite da chamada da API define o tempo máximo para toda a operação da API, incluindo todas as tentativas de repetição. Esse tempo limite fornece um limite rígido de quanto tempo seu aplicativo espera pela conclusão de uma operação completa.
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();
Características principais:
Inclui todas as tentativas de repetição.
Inclui o tempo gasto esperando entre as novas tentativas.
Fornece tempo de espera máximo absoluto.
Impede que as operações sejam executadas indefinidamente.
Tempo limite da tentativa de chamada de API
O tempo limite da tentativa de chamada da API define o tempo máximo para uma única tentativa de uma operação da API. Se esse tempo limite for excedido, o SDK repetirá a operação (se as tentativas estiverem configuradas) em vez de falhar em toda a chamada.
S3Client s3Client = S3Client.builder() .overrideConfiguration(ClientOverrideConfiguration.builder() .apiCallAttemptTimeout(Duration.ofSeconds(30)) // Time for single attempt. .build()) .build();
Características principais:
Aplica-se somente a tentativas individuais.
Permite falhas rápidas e novas tentativas para solicitações lentas.
Deve ser menor que o tempo limite da chamada da API.
Ajuda a identificar e se recuperar de problemas transitórios.
Configurar tempos limite do cliente de serviço
Você pode configurar os tempos limite do cliente de serviço globalmente para todas as operações ou por solicitação:
Configuração global:
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.
Configuração por solicitação:
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"));
Práticas recomendadas para tempos limite de API
O SDK for Java 2.x não define tempos limite de chamada de API ou tempos limite de tentativa de chamada de API individuais por padrão. Defina tempos limite para tentativas individuais e para toda a solicitação. Isso ajuda seu aplicativo a falhar rapidamente quando problemas transitórios fazem com que as tentativas de solicitação demorem mais ou quando ocorrem problemas fatais de rede.
Tempos limite do cliente HTTP
Os tempos limite do cliente HTTP operam no nível da rede e controlam vários aspectos da comunicação HTTP. Esses tempos limite variam de acordo com a implementação do cliente HTTP que você usa.
Tempo limite da conexão
O tempo limite da conexão controla quanto tempo esperar ao estabelecer uma nova conexão com o AWS service (Serviço da AWS) endpoint.
// Available with all HTTP clients. ApacheHttpClient.builder() .connectionTimeout(Duration.ofSeconds(5L)) .build();
Propósito:
Evita problemas de conectividade de rede.
Falha rapidamente quando os serviços estão inacessíveis.
Essencial para aplicativos que precisam de tratamento responsivo de erros.
Tempo limite do soquete (Apache e clientes) URLConnection
O tempo limite do soquete controla quanto tempo esperar pelos dados em uma conexão estabelecida.
ApacheHttpClient.builder() .socketTimeout(Duration.ofSeconds(30L)) // Time to wait for response data. .build();
Tempos limite de leitura e gravação (cliente Netty)
O cliente Netty fornece tempos limite separados para operações de leitura e gravação:
NettyNioAsyncHttpClient.builder() .readTimeout(Duration.ofSeconds(30L)) // Reading response data. .writeTimeout(Duration.ofSeconds(30L)) // Writing request data. .build();
Tempo limite de negociação do TLS (cliente Netty)
Controla o tempo permitido para o TLS/SSL aperto de mão:
NettyNioAsyncHttpClient.builder() .tlsNegotiationTimeout(Duration.ofSeconds(3L)) .build();
Tempos limite do pool de conexão
Alguns clientes HTTP fornecem tempos limite para operações do pool de conexões:
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()
O Configurar clientes HTTP contém mais informações sobre clientes HTTP no AWS SDK for Java 2.x
Interações e hierarquia de tempo limite
Entender como os diferentes tempos limite interagem é crucial para uma configuração adequada:
Hierarquia de tempo limite
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]
Regras de configuração
- Tempo limite de chamada de API ≥ Tempo limite de tentativa de chamada de API
-
// Correct configuration. .apiCallTimeout(Duration.ofMinutes(2)) // 120 seconds. .apiCallAttemptTimeout(Duration.ofSeconds(30)) // 30 seconds.
- Tempo limite de tentativa de chamada de API ≥ tempos limite do cliente HTTP
-
// 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).
- Conta para várias tentativas
-
// 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.
Use padrões de configuração inteligente
O SDK fornece padrões inteligentes que configuram automaticamente os valores de tempo limite apropriados:
// 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.
Os padrões inteligentes configuram automaticamente:
Valores de tempo limite de conexão.
Valores de tempo limite de negociação do TLS.
Outras configurações do cliente.
Resumo
A configuração efetiva do tempo limite AWS SDK for Java 2.x requer a compreensão da interação entre os tempos limite do cliente de serviço e os tempos limite do cliente HTTP:
Os tempos limite do cliente de serviço controlam o comportamento de alto nível da API.
Os tempos limite do cliente HTTP controlam o comportamento de rede de baixo nível.
A hierarquia adequada garante que os tempos limite funcionem juntos de forma eficaz.
Os padrões inteligentes fornecem bons pontos de partida para a maioria dos aplicativos.
Configure os tempos limite de acordo com seu caso de uso para criar aplicativos que sejam resilientes a problemas de rede e responsivos aos usuários.