Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ Data Encryption Workshop/ Prácticas recomendadas/ Generales/ Reintento de solicitudes de DEW fallidas con retardo exponencial
Actualización más reciente 2024-09-13 GMT+08:00

Reintento de solicitudes de DEW fallidas con retardo exponencial

Escenario

Si recibe un mensaje de error al invocar a una API, puede utilizar el retroceso exponencial para volver a intentar la solicitud.

Cómo funciona

Si el lado del servicio informa de errores consecutivos (como errores de limitación de tráfico), el acceso continuo seguirá causando conflictos. El retroceso exponencial puede ayudarle a evitar este tipo de errores.

Restricciones

La cuenta actual tiene una clave habilitada.

Ejemplo

  1. Prepare la información básica de autenticación.
    • ACCESS_KEY: Clave de acceso de la cuenta de Huawei. Para obtener más detalles, consulte ¿Cómo obtengo una clave de acceso (AK/SK)?
    • SECRET_ACCESS_KEY: Clave de acceso secreta de la cuenta de Huawei. Para obtener más detalles, consulte ¿Cómo obtengo una clave de acceso (AK/SK)?
    • PROJECT_ID: ID del proyecto del sitio. Para obtener más detalles, consulte Obtención de un ID de proyecto.
    • KMS_ENDPOINT: El punto de conexión para acceder al KMS. Para obtener más detalles, consulte Puntos de conexión.
    • Habrá riesgos de seguridad si la AK/SK utilizada para la autenticación se escribe directamente en el código. Cifre la AK/SK en el archivo de configuración o en las variables de entorno para su almacenamiento.
    • En este ejemplo, las AK/SK almacenadas en las variables de entorno se utilizan para la autenticación de identidad. Primero configure las variables de entorno HUAWEICLOUD_SDK_AK y HUAWEICLOUD_SDK_SK en el entorno local.
  2. Código para el retroceso 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);
                         }
                     }
                 }
             }
         }
     }