Configurar tempos limite no AWS SDK for Java 2.x
O AWS SDK for Java 2.x fornece várias camadas de configuração de tempo limite para ajudar a criar aplicações resilientes. O SDK oferece diferentes tipos de tempos limite que funcionam juntos para otimizar o desempenho e a confiabilidade da aplicação.
Existem quatro categorias principais de tempo limite no SDK:
-
Tempo limite do cliente de serviço: tempo limite de alto nível que controla as operações da API
-
Tempo limite do cliente HTTP: tempo limite de baixo nível que controla a comunicação de rede
Tempo limite do cliente de serviço
O tempo limite do cliente de serviço opera no nível da API e controla o comportamento geral das operações de serviço, incluindo novas tentativas e várias tentativas.
Tempo limite de chamada de API
O tempo limite de chamada de API define a quantidade máxima de tempo para toda a operação de API, incluindo todas as novas tentativas. Esse tempo limite impõe um limite rígido de quanto tempo a aplicação deve esperar até que uma operação completa seja concluída.
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 novas tentativas.
Inclui o tempo de espera 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 de API define o tempo máximo para uma única tentativa de uma operação de API. Se esse tempo limite for excedido, o SDK repetirá a operação (se houver uma configuração de novas tentativas) 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 de API.
Ajuda a identificar e se recuperar de problemas transitórios.
Configurar o tempo limite do cliente de serviço
É possível configurar o tempo 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 tempo limite de API
O SDK para Java 2.x não define o tempo limite de chamada de API nem o tempo limite de tentativas de chamada de API individuais por padrão. Defina o tempo limite tanto para as tentativas individuais como para toda a solicitação. Isso ajuda a aplicação a antecipar-se à falha quando problemas transitórios fazem com que as tentativas de solicitação demorem mais ou quando ocorrem problemas fatais de rede.
Tempo limite do cliente HTTP
O tempo limite do cliente HTTP opera no nível da rede e controla vários aspectos da comunicação HTTP. Esse tempo limite varia 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 endpoint do AWS service (Serviço da AWS).
// Available with all HTTP clients. ApacheHttpClient.builder() .connectionTimeout(Duration.ofSeconds(5L)) .build();
Finalidade:
Evita travamentos em caso de problemas de conectividade na rede.
Antecipa-se à falha quando os serviços estão inacessíveis.
Essencial para aplicações que precisam de gerenciamento responsivo de erros.
Tempo limite do soquete (clientes Apache e 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();
Tempo limite de leitura e gravação (cliente Netty)
O cliente Netty fornece um tempo limite distinto 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 handshake TLS/SSL:
NettyNioAsyncHttpClient.builder() .tlsNegotiationTimeout(Duration.ofSeconds(3L)) .build();
Tempo limite do grupo de conexão
Alguns clientes HTTP fornecem um tempo 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
Hierarquia e interações do tempo limite
Noções básicas de 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 ≥ Tempo 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). - Considerar 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.
Usar padrões de configuração inteligentes
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 de TLS.
Outras configurações de cliente.
Resumo
A configuração efetiva do tempo limite no AWS SDK for Java 2.x requer a compreensão da interação entre o tempo limite do cliente de serviço e o tempo limite do cliente HTTP:
O tempo limite do cliente de serviço controla o comportamento de alto nível da API.
O tempo limite do cliente HTTP controla 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 das aplicações.
Configure os tempos limite de acordo com seu caso de uso para criar aplicações que sejam resilientes a problemas de rede e responsivos aos usuários.