Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda/ Data Encryption Workshop/ Melhores práticas/ Geral/ Repetição de solicitações do DEW com falha usando retirada exponencial
Atualizado em 2024-09-14 GMT+08:00

Repetição de solicitações do DEW com falha usando retirada exponencial

Cenário

Se você receber uma mensagem de erro ao chamar uma API, poderá usar a retirada exponencial para repetir a solicitação.

Como funciona

Se erros consecutivos (como erros de limitação de tráfego) forem relatados pelo lado do serviço, o acesso contínuo continuará causando conflitos. A retirada exponencial pode ajudá-lo a evitar tais erros.

Restrições

A conta atual tem uma chave ativada.

Exemplo

  1. Prepare informações básicas de autenticação.
    • ACCESS_KEY: chave de acesso da conta da Huawei. Para obter detalhes, consulte Como obter uma chave de acesso (AK/SK)?
    • SECRET_ACCESS_KEY: chave de acesso de segredo da conta da Huawei. Para obter detalhes, consulte Como obter uma chave de acesso (AK/SK)?
    • PROJECT_ID: ID do projeto do site. Para obter detalhes, consulte Obtenção de um ID de projeto.
    • KMS_ENDPOINT: ponto de extremidade para acessar o KMS. Para obter detalhes, consulte Pontos de extremidade.
    • Haverá riscos de segurança se a AK/SK usada para autenticação for gravada diretamente no código. Criptografe a AK/SK no arquivo de configuração ou nas variáveis de ambiente para armazenamento.
    • Neste exemplo, a AK/SK armazenada nas variáveis de ambiente é usada para autenticação de identidade. Configure as variáveis de ambiente HUAWEICLOUD_SDK_AK e HUAWEICLOUD_SDK_SK primeiro no ambiente local.
  2. Código para retirada exponencial:
    import com.huaweicloud.sdk.core.auth.BasicCredentials;
     import com.huaweicloud.sdk.core.auth.ICredential;
     import com.huaweicloud.sdk.core.exception.ClientRequestException;
     import com.huaweicloud.sdk.kms.v2.model.EncryptDataRequest;
     import com.huaweicloud.sdk.kms.v2.model.EncryptDataRequestBody;
     import com.huaweicloud.sdk.kms.v2.KmsClient;
    
     public class KmsEncryptExample {
         
         private static final String ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_AK");
    
         private static final String SECRET_ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_SK");
    
         private static final String KMS_ENDPOINT = "xxxx";
    
         private static final String KEY_ID = "xxxx";
    
         private static final String PROJECT_ID = "xxxx";
    
    
         private static KmsClient KmsClientInit() {
             ICredential auth = new BasicCredentials()
                     .withAk(ACCESS_KEY)
                     .withSk(SECRET_ACCESS_KEY)
                     .withProjectId(PROJECT_ID);
             return KmsClient.newBuilder()
                     .withCredential(auth)
                     .withEndpoint(KMS_ENDPOINT)
                     .build();
         }
    
         public static long getWaitTime(int retryCount) {
             long initialDelay = 200L;
             return (long) (Math.pow(2, retryCount) * initialDelay);
         }
    
         public static void encryptData(KmsClient client, String plaintext) {
             EncryptDataRequest request = new EncryptDataRequest().withBody(
                     new EncryptDataRequestBody()
                             .withKeyId(KEY_ID)
                             .withPlainText(plaintext));
             client.encryptData(request);
         }
    
         public static void main(String[] args) {
             int maxRetryTimes = 6;
             String plaintext = "plaintext";
             String errorMsg = "The throttling threshold has been reached";
    
             KmsClient client = KmsClientInit();
             for (int i = 0; i < maxRetryTimes; i++) {
                 try {
                     encryptData(client, plaintext);
                     return;
                 } catch (ClientRequestException e) {
                     if (e.getErrorMsg().contains(errorMsg)) {
                         try {
                             Thread.sleep(getWaitTime(i));
                         } catch (InterruptedException ex) {
                             throw new RuntimeException(ex);
                         }
                     }
                 }
             }
         }
     }