Control del comportamiento del tiempo de espera de la API de datos - Amazon Aurora

Control del comportamiento del tiempo de espera de la API de datos

Todas las llamadas a la API de datos son síncronas. Imaginemos que realiza una operación de API de datos que ejecuta una instrucción de SQL como INSERT oCREATE TABLE. Si la llamada a la API de datos se devuelve correctamente, el procesamiento de SQL finaliza cuando se devuelve la llamada.

De forma predeterminada, la API de datos cancela una operación y devuelve un error de tiempo de espera si la operación no termina de procesarse en 45 segundos. En ese caso, los datos no se insertan, la tabla no se crea, etc.

Puede usar la API de datos para realizar operaciones de larga duración que no se puedan completar en 45 segundos. Si espera que una operación, como una operación masiva de INSERT o DDL en una tabla grande, tarde más de 45 segundos, puede especificar el parámetro continueAfterTimeout para la operación ExecuteStatement. La aplicación sigue recibiendo el error de tiempo de espera. Sin embargo, la operación continúa ejecutándose y no se cancela. Para ver un ejemplo, consulta Ejecución de una transacción SQL.

Si el AWS SDK de su lenguaje de programación tiene su propio tiempo de espera para las llamadas a la API o las conexiones de sockets HTTP, asegúrese de que todos esos periodos de tiempo de espera sean superiores a 45 segundos. En algunos SDK, el tiempo de espera es inferior a 45 segundos de forma predeterminada. Recomendamos ajustar cualquier periodo de tiempo de espera específico del SDK o específico del cliente en al menos un minuto. De este modo, se evita la posibilidad de que la aplicación reciba un error de tiempo de espera mientras la operación de la API de datos se complete correctamente. De esta forma, puede estar seguro de si desea volver a intentar la operación o no.

Por ejemplo, supongamos que el SDK devuelve un error de tiempo de espera a su aplicación, pero la operación de la API de datos sigue completándose dentro del intervalo de tiempo de espera de la API de datos. En ese caso, volver a intentar la operación podría insertar datos duplicados o producir resultados incorrectos. Es posible que el SDK vuelva a intentar la operación automáticamente, lo que provoca datos incorrectos sin que la aplicación realice ninguna acción.

El intervalo de tiempo de espera es especialmente importante para el SDK de Java 2. En ese SDK, el tiempo de espera de la llamada a la API y el tiempo de espera del socket HTTP es de 30 segundos de forma predeterminada. En este ejemplo se muestra cómo ajustar esos tiempos de espera en un valor superior:

public RdsDataClient createRdsDataClient() { return RdsDataClient.builder() .region(Region.US_EAST_1) // Change this to your desired Region .overrideConfiguration(createOverrideConfiguration()) .httpClientBuilder(createHttpClientBuilder()) .credentialsProvider(defaultCredentialsProvider()) // Change this to your desired credentials provider .build(); } private static ClientOverrideConfiguration createOverrideConfiguration() { return ClientOverrideConfiguration.builder() .apiCallTimeout(Duration.ofSeconds(60)) .build(); } private HttpClientBuilder createHttpClientBuilder() { return ApacheHttpClient.builder() // Change this to your desired HttpClient .socketTimeout(Duration.ofSeconds(60)); }

A continuación, se muestra un ejemplo equivalente con el cliente de datos asíncrono:

public static RdsDataAsyncClient createRdsDataAsyncClient() { return RdsDataAsyncClient.builder() .region(Region.US_EAST_1) // Change this to your desired Region .overrideConfiguration(createOverrideConfiguration()) .credentialsProvider(defaultCredentialsProvider()) // Change this to your desired credentials provider .build(); } private static ClientOverrideConfiguration createOverrideConfiguration() { return ClientOverrideConfiguration.builder() .apiCallAttemptTimeout(Duration.ofSeconds(60)) .build(); } private HttpClientBuilder createHttpClientBuilder() { return NettyNioAsyncHttpClient.builder() // Change this to your desired AsyncHttpClient .readTimeout(Duration.ofSeconds(60)); }