Contrôle du comportement en cas d’expiration de l’API de données - Amazon Aurora

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Contrôle du comportement en cas d’expiration de l’API de données

Tous les appels à l’API de données sont synchrones. Supposons que vous exécutiez une opération d’API de données qui exécute une instruction SQL comme INSERT ou CREATE TABLE. Si l’appel de l’API de données aboutit, le traitement SQL se termine lorsque l’appel est renvoyé.

Par défaut, l’API de données annule une opération et renvoie une erreur d’expiration du délai si le traitement de l’opération ne s’est pas terminé dans les 45 secondes. Dans ce cas, les données ne sont pas insérées, la table n’est pas créée, etc.

Vous pouvez utiliser l’API de données pour effectuer des opérations de longue durée qui ne peuvent pas être effectuées en 45 secondes. Si vous estimez qu’une opération, telle qu’une opération DDL ou INSERT en bloc sur une table de grande taille, durera plus de 45 secondes, vous pouvez spécifier le paramètre continueAfterTimeout de l’opération ExecuteStatement. Votre application recevra tout de même le message d’erreur d’expiration du délai. Toutefois, l’opération continuera et ne sera pas annulée. Pour obtenir un exemple, consultez Exécution d’une transaction SQL.

Si le kit AWS SDK correspondant à votre langage de programmation utilise son propre délai d’expiration pour les appels d’API ou les connexions au socket HTTP, assurez-vous que tous ces délais soient supérieurs à 45 secondes. Pour certains kits SDK, le délai d’expiration par défaut est inférieur à 45 secondes. Nous vous recommandons de spécifier des délais d’expiration spécifiques aux kits SDK ou aux clients d’au moins une minute. Cela permet d’éviter que votre application reçoive une erreur d’expiration du délai alors que l’opération de l’API de données aboutit. Et vous savez ainsi quand vous devez retenter l’opération ou non.

Supposons, par exemple, que le kit SDK renvoie une erreur d’expiration du délai à votre application, mais que l’opération de l’API de données se termine tout de même dans l’intervalle d’expiration de l’API. Dans ce cas, une nouvelle tentative d’exécution de cette opération risquerait d’insérer des données dupliquées ou de générer des résultats incorrects. Le kit SDK pourrait réessayer d’exécuter l’opération automatiquement, ce qui entraînerait des données incorrectes sans aucune action de la part de votre application.

L’intervalle d’expiration est particulièrement important pour le SDK Java 2. Dans ce kit SDK, le délai d’expiration des appels d’API et celui du socket HTTP sont tous deux de 30 secondes par défaut. Voici un exemple de procédure à suivre pour définir une valeur supérieure pour ces délais d’expiration :

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)); }

Voici un exemple équivalent utilisant le client de données asynchrone :

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)); }