O mecanismo avançado de backoff usa informações de throttling do servidor para calcular intervalos de nova tentativa e gerencie taxas de requisições de API durante ciclos de throttling.
Os mecanismos de nova tentativa e a política de throttling foram adicionados. Para mais informações, consulte Retry mechanism.
A biblioteca principal aliyun-java-sdk-core V4.6.0 e versões posteriores oferecem suporte ao mecanismo de nova tentativa e fornecem um mecanismo avançado de backoff baseado na política de throttling. Para mais informações, consulte Retry mechanism. Adicione a seguinte dependência Maven:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
</dependency>
Nem todas as operações de API oferecem suporte ao mecanismo avançado de backoff. Para verificar se uma operação de API é compatível com esse mecanismo, consulte a seção Quotas Info na documentação da API do service correspondente. Por exemplo, veja a seção Quotas Info no tópico DescribeHpcClusters do Elastic Compute Service (ECS).
Ative esse mecanismo no SDK independentemente do suporte das operações de API. Caso as operações não ofereçam suporte, a política de backoff e a política de desativação de requisições não entrarão em vigor. No entanto, se essas operações passarem a oferecer suporte ao mecanismo posteriormente, a política de throttling e a política de desativação de requisições poderão ser acionadas inesperadamente, dificultando a solução de problemas.
Após ativar esse mecanismo, continue monitorando chamadas de API com falha. Depender exclusivamente do mecanismo de backoff pode tornar a identificação de problemas mais complexa.
Os exemplos abaixo pressupõem que as operações de API oferecem suporte ao mecanismo de backoff baseado na política de throttling.
Visão geral
O mecanismo avançado de backoff inclui duas políticas:
Política de backoff
Política de desativação de requisições de API durante o throttling
O algoritmo de backoff exponencial EqualJitter calcula os intervalos de nova tentativa. Para mais detalhes, consulte Retry mechanism. O mecanismo avançado de backoff ajusta ainda mais esses intervalos com base nas informações de throttling do servidor.
Ative a política de backoff baseada na política de throttling
Por padrão, a política de backoff baseada em throttling fica desativada. Para ativá-la, use um dos métodos abaixo:
Configure uma política de nova tentativa.
RetryPolicy retryPolicy = RetryPolicy.builder()
.maxNumberOfRetries(3) // The maximum number of retries.
.maxDelayTimeMillis(20 * 1000) // The maximum retry interval. Unit: milliseconds. If the interval is exceeded, no retries are performed.
//.retryConditions(retryConditions) // The policy that is used to trigger retries.
.enableAliyunThrottlingControl(true) // Enable the backoff policy based on the throttling policy.
//.throttlingConditions(throttlingConditions) // The policy that is used to restrict retries.
.build();
request.setSysRetryPolicy(retryPolicy);
Use a política de nova tentativa padrão.
// The default policy. The request parameter is enableAliyunThrottlingControl. The value true specifies that the backoff policy based on the throttling policy is enabled. The value false specifies that the backoff policy based on the throttling policy is disabled.
RetryPolicy retryPolicy = RetryPolicy.defaultRetryPolicy(
true
);
request.setSysRetryPolicy(retryPolicy);
Benefícios de ativar a política de backoff baseada na política de throttling
Reduz novas tentativas desnecessárias e diminui o consumo de recursos do sistema.
Calcula intervalos de backoff mais precisos, aumentando as taxas de sucesso das novas tentativas.
Configurações avançadas
Política de backoff: Cálculo do tempo de backoff com base na política de throttling
Quando a política de backoff baseada em throttling está ativa, o cálculo do tempo de backoff segue estas regras:
Na ausência de throttling, o EqualJitter calcula o intervalo de nova tentativa.
Se houver throttling, o intervalo de nova tentativa corresponderá ao maior valor entre o tempo restante do ciclo atual de throttling e o resultado do EqualJitter. Caso esse intervalo exceda o intervalo máximo de nova tentativa, o sistema lançará uma exceção e armazenará em cache o tempo restante do ciclo de throttling para uso pela política de desativação de requisições.
Política de desativação de requisições de API durante o throttling
Com a política de backoff baseada em throttling ativa e o throttling acionado, o servidor retorna informações de cota restante no cabeçalho da resposta. Esses dados incluem o número restante de chamadas de API e o tempo restante do ciclo atual de throttling, reportados nas dimensões "User" e "API + User". Se as chamadas de API sofrerem throttling, a contagem restante de chamadas será 0.
Chaves correspondentes às duas dimensões no cabeçalho:
Dimensão "API + User": X-RateLimit-User-API
Dimensão "User": X-RateLimit-User
Exemplo da dimensão "API + User":
"X-RateLimit-User-API" : "Remain:1,Limit:2,Time:1000,TimeLeft:122,Reset:1637835220000"
Remain: número restante de chamadas de API. O valor do parâmetro Remain é do tipo INT. Se o valor for -1, o número restante de chamadas de API é suficiente. Se as chamadas de API sofrerem throttling, o valor retornado será 0.
Limit: the maximum throttling threshold. The value is of the INT type.
Time: the time span of throttling. The value is of the LONG type. Unit: milliseconds.
TimeLeft: the remaining time of the current throttling cycle. The value is of the LONG type. Unit: milliseconds.
Reset: the start time of the next throttling cycle. The value is of the LONG type and is a timestamp in milliseconds
.
O SDK rastreia o tempo restante do ciclo atual de throttling e bloqueia novas chamadas ou novas tentativas durante esse período. Se o tempo restante exceder o intervalo máximo de nova tentativa, o sistema lançará um erro. Caso contrário, o sistema aguardará o fim do ciclo de throttling antes de iniciar ou tentar novamente a chamada.
Ative a depuração de throttling
Para obter informações de cota de throttling sem precisar esperar que o throttling seja acionado, defina X-RateLimit-Mode como debug no cabeçalho da requisição.
request.putHeadParameter("X-RateLimit-Mode", "debug");
As informações de cota restante serão então incluídas no cabeçalho de resposta de cada chamada de API.